跳过std :: istream中的行

时间:2010-04-05 23:39:08

标签: c++ istream

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

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

4 个答案:

答案 0 :(得分:12)

不,您不必使用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秒。

答案 1 :(得分:11)

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


  

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

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

答案 2 :(得分:8)

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

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

您可以通过其他方式阅读,例如ifstream::read,但std::getline可能是最简单,最明确的解决方案。

答案 3 :(得分:7)

为了它的价值:

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