Art*_*bev 13
不,你不必使用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);
}
Run Code Online (Sandbox Code Playgroud)
当然,HandleReadingLineError不是标准的,而是手工制作的.第一个参数是要提取的最大字符数.如果这正是numeric_limits :: max(),则没有限制:cplusplus.com上的链接:std :: istream :: ignore
如果你要跳过很多行,你肯定应该使用它而不是getline:当我需要在我的文件中跳过100000行时,使用getline需要大约一秒钟的22秒.
Bil*_*eal 11
编辑:你也可以使用std :: istream :: ignore,参见/sf/answers/1750879651/
我是否必须使用getline我想跳过的行数?
不,但它可能是阅读代码的人最清楚的解决方案.如果您跳过的行数很大,则可以通过读取大块并计算每个块中的换行符来提高性能,停止并将文件重新定位到上一个换行符的位置.但除非你遇到性能问题,否则我只是将getline放在一个循环中,以获取要跳过的行数.
是的,std::getline除非您知道换行符的位置.
如果由于某种奇怪的原因,您碰巧知道换行符出现的位置,那么您可以ifstream::seekg先使用.
您可以通过其他方式阅读,ifstream::read但std::getline可能是最简单,最明确的解决方案.
物有所值:
void skip_lines(std::istream& pStream, size_t pLines)
{
std::string s;
for (; pLines; --pLines)
std::getline(pStream, s);
}
Run Code Online (Sandbox Code Playgroud)