C++ 跳过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从std::istream派生类中读取行,如何向前移动几行

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

是,除非您知道换行符的位置,否则请使用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

更有效的方法是使用std::istream::ignore忽略字符串

当然,HandlerReadingLineError不是标准错误,而是手工造成的。 第一个参数是要提取的最大字符数。如果这正是数字限制::max,则没有限制: 链接cplusplus.com:


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

计算新行数是循环getline所能做的,对吗?@GMan-拯救独角兽:是的,但是,如果知道n很大,可以使用较大的块并向前移动较大的距离,即在缓冲区块中计算多个换行符如果我将所有文件加载到内存并用正则表达式解析它呢?文件小于1MB。@Billy:事实上,你的迟到给了我10次额外的重复,因为我在10分钟前已经达到了最大容量。哈哈!我还没有把头撞到那顶帽子上。
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);
}