Пропустить строки в 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);
}