【问题标题】:c++ ifstream object "reseting"c ++ ifstream对象“重置”
【发布时间】:2013-07-09 21:36:34
【问题描述】:

我有一个函数 func1(ifstream& fin) 使用多次调用 fin.getline() 从文件中读取。现在在这个 func1 中,我还调用了另一个必须访问 func1 正在访问的文件的函数 func2(ifstream&)。我可以简单地将 func2 称为 func2(fin)。

现在假设 func1 读取文件直到第 4 行,然后调用 func2 并做它的事情,读取文件直到第 7 行。现在问题是:一旦 func1 返回到 func1,我想继续从 func1 离开的地方读取文件,即第 5 行,但这是不可能的,因为 fin 现在“指向”文件的第 8 行。

我已经尝试将 func2 定义为 func2(const ifstream&) 和 func2(const ifstream*) 或在 func1 中创建 fin 的副本并将其传递给 func2,但编译器不会接受任何这些选项。

我该怎么办?谢谢。

【问题讨论】:

  • 您可以保存您的位置并在之后寻找它。
  • 查找流成员函数tellgseekg。您的文件打开模式必须允许查找(ie 不会被标记为顺序读取)

标签: c++ file fstream


【解决方案1】:

通常,如果您想“返回”,您可以使用fstream::tellg() 告诉您当前所在的位置,并使用fstream::seekg() 回到该点。

我通常更喜欢的另一种选择是只读取一次行,并拥有一个缓存/行存储,其中包含足够的行,您可以在所需区域上来回移动。假设文件不是绝对巨大,将所有行保存在一个向量中效果相当好。如果文件是几千兆字节,这可能不是一个选项(在嵌入式设备上,即使几兆字节也可能太大而无法容纳所有文件),在这种情况下,您需要使用某种“discrding”您不再需要的东西的方法.

【讨论】:

    猜你喜欢
    • 2011-12-02
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2015-01-24
    相关资源
    最近更新 更多