我正在使用std :: getline()从std :: istream派生类中读取行,我该如何向前移几行?
我必须阅读并丢弃它们吗?
答案 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);
}