0

ifstream用来解析 C++ 代码中的文件。我无法使用seekg()tellg()跳转到代码的特定行。

特别是我想用getLine方法从文件的特定位置读取一行。上一次迭代中保存的位置。

4

2 回答 2

3

您只需跳过所需的行数。最好的方法是使用 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。

于 2015-09-08T09:10:04.167 回答
0

似乎没有特定的 C++ 函数,如“seekline”,可以满足您的需求,我看到了两种解决此任务的方法:

  1. 初步您可以用空格扩展文本文件中的每一行以达到恒定长度L。比,要寻找所需的行N,只需使用 seekgL * N偏移量。
  2. 这种方法比较复杂。您可以创建一个辅助二进制文件,它的每个字节都将保持源文件每一行的长度。这个辅助文件是一种数据库。接下来,您必须在初始化阶段将此二进制文件加载到程序中的数组中。文本文件中所需行的偏移量应计算为前N个数组元素的总和。当然,需要同时更新辅助文件和源文件。

如果文本文件忠实于它的大小要求,则第一种情况会更有效。第二种情况为长文本文件和罕见的编辑操作带来了最佳性能。

于 2015-09-08T09:29:05.180 回答