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

时间:2015-09-08 08:56:22

标签: c++ ifstream seekg

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

特别是我想从文件的特定位置读取一行,使用方法getLine。位置保存在先前的迭代中。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

似乎没有特定的C ++函数,比如“seekline”,满足您的需求,我看到了两种方法来解决这个问题:

  1. 初步可以使用空格扩展textfile中的每一行以达到a 恒定长度 L 。比,要寻找所需的行 N ,只需使用 seekg L * N 偏移。
  2. 这种方法比较复杂。您可以创建辅助二进制文件 文件,它的每个字节将保持每行源的长度 文件。这个辅助文件是一种数据库。接下来,你必须 在初始化阶段将此二进制文件加载到程序中的数组中。 a的偏移量 textfile中的必需行应计算为第一个 N 数组的总和 元素。当然,有必要同时更新辅助文件和源文件。
  3. 如果文本文件忠于其大小要求,则第一种情况更有效。第二种情况为长文本文件和罕见的编辑操作带来了最佳性能。