【问题标题】:ifstream how to start read line from a particular line using c++ifstream如何使用c ++从特定行开始读取行
【发布时间】:2015-09-08 08:56:22
【问题描述】:

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

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

【问题讨论】:

  • “上一次迭代中保存的位置”是什么意思。?你在什么意义上迭代?如果您正在遍历文件,您可以调用getline(my_ifstream, my_string) 依次读取每一行。如果您有一个完整的行号并希望从文件中实际上不相关的位置跳转到该行,则需要从某个已知行位置(例如位置 0 处的第 1 行)读取并在进行时计算换行符。
  • @TonyD 是的,我正在遍历文件,但在某些时候我会停下来处理另一个文件。然后在那之后,我想从第一个文件使用'getline(my_ifstream,my_string)'之前读取的最后一行重新开始。
  • 每个ifstream 保持其自己的输入位置 - 如果您对不同的文件使用不同的ifstream 对象,您可以继续阅读您在第一个文件中中断的行,而不会产生任何麻烦。如果实在想用同一个ifstream,可以调用tellg获取当前位置,稍后再调用seekg恢复。
  • @TonyD 感谢您的帮助。

标签: c++ ifstream seekg


【解决方案1】:

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

【讨论】:

  • 所以,我应该使用它来跳转总行数,然后调用getLine 读取下一行。对吗?
  • @Mattia,是的,你是对的。您需要根据需要读出尽可能多的行来归档您要阅读的行。该文件本身不包含任何有助于直接跳转到所需位置的元(辅助)数据。如果您不自己收集此类元数据,则阅读时数行是唯一的方法。基本事实是使用 ignore 而不是 getline 效率更高。
  • 完美,它似乎工作正常。感谢您的帮助。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-27
    • 2017-04-11
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    相关资源
    最近更新 更多