Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 跳过std::istream中的行_C++_Istream - Fatal编程技术网

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

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);
}
更有效的方法是忽略带有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);
}
for(int currLineNumber=0;currLineNumber
当然,HandlerReadingLineError不是标准错误,而是手工造成的。 第一个参数是要提取的最大字符数。如果这正是数值限制::max(),则没有限制: 链接cplusplus.com:


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

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