繁体   English   中英

跳过std :: istream中的行

[英]Skip lines in std::istream

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

我是否必须阅读并丢弃它们?

不,您不必使用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行时,使用getline花费的时间与22秒相反,大约需要一秒钟。

编辑:您也可以使用std :: istream :: ignore,请参阅https://stackoverflow.com/a/25012566/492336


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

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

是的,除非您知道换行符的位置,否则请使用std::getline

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

您可以用其他方式阅读,例如ifstream::readstd::getline可能是最简单,最清晰的解决方案。

物有所值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM