我使用ifstream
来解析c++代码中的文件。我不能使用seekg()
和tellg()
在代码的特定行中跳转。
特别地,我想用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 {
// todo: handle the error
}
}
第一个参数是要提取的最大字符数。如果正好是numeric_limits::max(),则没有限制。
您应该使用is而不是std::getline,因为性能更好。
似乎没有特定的c++函数,如"seekline",以满足您的需求,我看到两种方法来解决这个任务:
- 初值你可以用空格展开文本文件中的每一行,以达到定长L。然后,要查找所需行N,只需使用
seekg
L * N偏移 - 这种方法比较复杂。您可以创建一个辅助二进制文件文件,它的每个字节将保持源代码的每行长度文件。这个辅助文件是一种数据库。接下来,你必须在初始化阶段将这个二进制文件加载到程序的数组中。a的偏移量textfile中的所需行应计算为第一个N数组的和元素。当然,需要同时更新辅助文件和源文件。
如果文本文件符合其大小要求,则第一种情况更有效。第二种情况对于长文本文件和稀有的编辑操作具有最佳性能。