【问题标题】:How can I copy the state of an ifstream?如何复制 ifstream 的状态?
【发布时间】:2015-12-02 04:05:23
【问题描述】:

我有一个函数,它接受一个 ifstream、ifs,并使用它来填充它: std::vector 矩阵; (这是一项任务,我对如何更好地实现这一点没有任何发言权)。 在开始填写“矩阵”之前,我想知道我正在阅读的文件的长度 这样,我将避免不断调整大小。但是,我只有一个 ifstream 对象,ifs。如果我使用循环来查找文件的长度,我将位于文件的末尾,并且我不确定如何“刷新”一个 ifstream 以使其再次位于第一行。 我正在考虑的其他事情是创建 ifs 的副本。这样,我可以遍历一个 ifstream,关闭它,然后使用另一个来获取数据。 我觉得打开两个 ifstream 并指向同一个文件会有问题。

我不知道实现这两个想法的方法。请假设我无法再访问原始文件名/路径。

有什么想法吗?

【问题讨论】:

  • 我不认为你想要做这个复制的事情..从流中读取是一个 I/O 操作 AFAIK,读取数据两次是一个非常糟糕的主意..你'通过向量调整 mem 的大小比再次从流中读取要好
  • 文件中的矩阵是如何编码的?你怎么知道它的大小?
  • 矩阵每行对应一行,每行每一个字符对应一列;它可以变得相当大。

标签: c++ ifstream


【解决方案1】:

不要尝试复制流。
要跳到开头,只需使用seekg

ifs.seekg(0);

如果您在查找之前到达了流的末尾,另一个问题是流在内部记住了文件结尾,而 seekg 不会重置它。为此,请使用

ifs.clear();

在寻找之前。

【讨论】:

  • 不是流 I/O 绑定...?我的意思是重新调整向量的大小比重新读取整个流更好..?直到 - 当然,重新调整大小几乎是无限次......这甚至可能比读取永无止境的流更快......
  • 在这种情况下,它可能会更好,是的。在一般情况下,文件不适合 RAM。
  • 如果您的唯一目标是查找行数,是否有必要读取整个流?
  • @user3753669 查找行数意味着您需要查找和计算换行符,它可以在文件中的任何位置。是的,有必要为此读取文件。
  • @deviantfan "Error 1 error C2039: 'reset' : is not a member of 'std::basic_ifstream>'" 我看了一些方法您的想法并发现 ifs.clear() 在您的示例中产生了 ifs.reset() 的结果。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-03-05
  • 2014-08-05
  • 2023-03-24
  • 1970-01-01
  • 2015-05-18
  • 2018-03-05
  • 2020-03-21
  • 2013-03-25
相关资源
最近更新 更多