12

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

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

4

3 回答 3

20

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

于 2014-07-29T09:53:21.633 回答
11

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


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

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

于 2010-04-05T23:42:12.237 回答
8

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

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

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

于 2010-04-05T23:42:10.467 回答