我正在使用 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::read
但std::getline
可能是最简单和最清晰的解决方案。