Пропустить строки в std::istream

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

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

4 ответов


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


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

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


нет, вам не нужно использовать 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.


Да использовать std::getline Если вы не знаете расположение строк.

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

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


для чего это стоит:

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