跳过std :: istream中的行

ufk*_*ufk 8 c++ istream

我正在使用std :: getline()从std :: istream派生类中读取行,如何向前移动几行?

我必须阅读并丢弃它们吗?

Art*_*bev 13

不,你不必使用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);
}
Run Code Online (Sandbox Code Playgroud)

当然,HandleReadingLineError不是标准的,而是手工制作的.第一个参数是要提取的最大字符数.如果这正是numeric_limits :: max(),则没有限制:cplusplus.com上的链接:std :: istream :: ignore

如果你要跳过很多行,你肯定应该使用它而不是getline:当我需要在我的文件中跳过100000行时,使用getline需要大约一秒钟的22秒.


Bil*_*eal 11

编辑:你也可以使用std :: istream :: ignore,参见/sf/answers/1750879651/


我是否必须使用getline我想跳过的行数?

不,但它可能是阅读代码的人最清楚的解决方案.如果您跳过的行数很大,则可以通过读取大块并计算每个块中的换行符来提高性能,停止并将文件重新定位到上一个换行符的位置.但除非你遇到性能问题,否则我只是将getline放在一个循环中,以获取要跳过的行数.

  • 计算换行符就像循环`getline`那样,对吧? (3认同)

Bri*_*ndy 8

是的,std::getline除非您知道换行符的位置.

如果由于某种奇怪的原因,您碰巧知道换行符出现的位置,那么您可以ifstream::seekg先使用.

您可以通过其他方式阅读,ifstream::readstd::getline可能是最简单,最明确的解决方案.


GMa*_*ckG 7

物有所值:

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