Пропускать строки в std :: istream - PullRequest
8 голосов
/ 06 апреля 2010

Я использую std :: getline () для чтения строк из производного от std :: istream класса, как я могу перейти на несколько строк вперед?

Должен ли я просто прочитать и выбросить их?

Ответы [ 4 ]

12 голосов
/ 29 июля 2014

Нет, вам не нужно использовать getline

Более эффективный способ - игнорировать строки с помощью std :: istream :: ignore

for (int currLineNumber = 0; currLineNumber < startLineNumber; ++currLineNumber){
    if (addressesFile.ignore(numeric_limits<streamsize>::max(), addressesFile.widen('\n'))){ 
        //just skipping the line
    } else 
        return HandleReadingLineError(addressesFile, currLineNumber);
}

HandleReadingLineError - это не стандартная, а ручная работа , конечно. Первый параметр - это максимальное количество символов для извлечения. Если это точно numeric_limits :: max (), ограничений нет: Ссылка на cplusplus.com: std :: istream :: ignore

Если вы собираетесь пропустить много строк, вам определенно следует использовать его вместо getline: когда мне нужно было пропустить 100000 строк в моем файле, это заняло около секунды вместо 22 секунд с getline.

11 голосов
/ 06 апреля 2010

Редактировать: Вы также можете использовать std :: istream :: ignore, см. https://stackoverflow.com/a/25012566/492336


Должен ли я использовать getline количество строк, которые я хочу пропустить?

Нет, но, вероятно, это будет самое ясное решение для тех, кто читает ваш код. Если количество пропускаемых строк велико, вы можете улучшить производительность, читая большие блоки и подсчитывая новые строки в каждом блоке, останавливая и перемещая файл в местоположение последней новой строки. Но если у вас нет проблем с производительностью, я просто поместил бы getline в цикл для количества строк, которые вы хотите пропустить.

8 голосов
/ 06 апреля 2010

Да, используйте std::getline, если вы не знаете, где находятся новые строки.

Если по какой-то странной причине вы знаете, где появляются новые строки, вы можете сначала использовать ifstream::seekg.

Вы можете читать другими способами, например ifstream::read, но std::getline, вероятно, самое простое и понятное решение.

7 голосов
/ 06 апреля 2010

За что стоит:

void skip_lines(std::istream& pStream, size_t pLines)
{
    std::string s;
    for (; pLines; --pLines)
        std::getline(pStream, s);
}
...