ifstream 如何使用 C++ 从特定行开始读取行

ifstream how to start read line from a particular line using c++

我正在使用 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",可以满足您的需要,我看到了两种解决此任务的方法:

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

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