C++ 跳过std::istream中的行
我使用std::getline()从std::istream派生类中读取行,如何向前移动几行C++ 跳过std::istream中的行,c++,istream,C++,Istream,我使用std::getline()从std::istream派生类中读取行,如何向前移动几行 我必须阅读并丢弃它们吗?是,除非您知道换行符的位置,否则请使用std::getline 如果出于某种奇怪的原因,您碰巧知道换行符出现的位置,那么您可以先使用ifstream::seekg 您可以通过其他方式进行阅读,例如ifstream::read,但是std::getline可能是最简单、最清晰的解决方案 编辑:您也可以使用std::istream::ignore,请参阅 是否必须使用getline
我必须阅读并丢弃它们吗?是,除非您知道换行符的位置,否则请使用
std::getline
如果出于某种奇怪的原因,您碰巧知道换行符出现的位置,那么您可以先使用ifstream::seekg
您可以通过其他方式进行阅读,例如
ifstream::read
,但是std::getline
可能是最简单、最清晰的解决方案 编辑:您也可以使用std::istream::ignore,请参阅
是否必须使用getline指定要跳过的行数 不,但对于那些阅读你的代码的人来说,这可能是最清晰的解决方案。如果要跳过的行数很大,可以通过读取大块并计算每个块中的换行数、停止文件并将其重新定位到最后一个换行的位置来提高性能。但是,除非您有性能问题,否则我会将getline放在一个循环中,以显示您要跳过的行数。了解它的价值:
void skip_lines(std::istream& pStream, size_t pLines)
{
std::string s;
for (; pLines; --pLines)
std::getline(pStream, s);
}
不,您不必使用getline
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);
}
更有效的方法是忽略带有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);
}
for(int currLineNumber=0;currLineNumber
当然,HandlerReadingLineError不是标准错误,而是手工造成的。
第一个参数是要提取的最大字符数。如果这正是数值限制::max(),则没有限制:
链接cplusplus.com:
如果你要跳过很多行,你肯定应该用它而不是getline:当我需要跳过我文件中的100000行时,它花了大约一秒钟的时间,而getline只花了22秒。计算换行数是循环的
getline
所能做的,对吗?@GMan-拯救独角兽:是的,但是,如果知道n很大,可以使用较大的块并向前移动较大的距离(即,在缓冲区块中计算多个换行符),如果我将所有文件加载到内存并用正则表达式解析它呢?文件小于1MB。@Billy:事实上,你的迟到给了我10次额外的重复,因为我在10分钟前已经达到了最大容量。哈哈!我还没有把头撞到那顶帽子上。