读取随时间变化的文件C ++

时间:2013-07-08 11:06:34

标签: c++ file input output

我打算用C ++读取一个文件。读取本身发生在while循环中,并从一个文件读取。

当函数从文件中读取信息时,它会将此信息推送到系统中的某个位置。问题是当循环正在进行时,此文件可能会更改。

我如何在文件中捕获新信息?我尝试了std::ifstream在我的计算机上手动阅读和更改我的文件,因为无限循环(每个循环之间有一个sleep(2))正在进行中,但正如预期的那样 - 没有任何事情发生。

编辑:文件将在每个新的数据条目覆盖自己。

帮助?

在虚拟机Ubuntu Linux 12.04上运行,如果这可能是有用的信息。这不是家庭作业。

4 个答案:

答案 0 :(得分:1)

通常的解决方案与MichaelH的方式相同 建议:写入过程以追加模式打开文件,并且 总是写到最后。阅读过程做了什么 迈克尔赫建议。

这适用于每次运行中的少量数据。如果 进程应该运行很长时间,并产生很多 数据,文件最终会变得太大,因为它会 包含所有已处理的数据。在这种情况下, 解决方案是使用目录,在其中生成编号文件, 每个数据记录一个文件。写作过程将写入每个 数据设置为新文件(递增数字),以及 读取过程将尝试打开新文件,并将其删除 什么时候结束这比复杂得多 第一个建议,但即使是流程也会有效 每秒生成大量数据并运行 年份。

编辑:

OP后来的评论说该设备实际上是一个FIFO。 在那种情况下:

  • 你不能寻求,所以MichaelH的建议不能使用 字面意思,但

  • 您无需搜索,因为数据会自动删除 无论何时读取,都来自FIFO,

  • 取决于数据的大小及其编写方式 写入可能是原子的,因此您不必担心部分 记录,即使你碰巧正好在中间阅读 写作。

关于后者:确保同时阅读和 写缓冲区足够大,可以包含完整的记录 作者在每张唱片后冲了过来。并确保 记录小于保证所需的大小 原子。 (从历史上看,在早期的Unix上,我知道,这是 4096,但如果它没有增加,我会感到惊讶 然后。虽然......在Posix下,这是由PIPE_BUF定义的, 只能保证至少512,而且只有4096 在现代Linux下。)

答案 1 :(得分:0)

只需读取文件,重命名文件,打开重命名的文件即可。处理数据到您的系统,并在循环结束时关闭文件。睡眠后,重新打开白色循环顶部的文件,重命名并重复。

这是解决问题的最简单方法,可以节省编写代码以在处理阶段处理文件的动态更改。

要绝对确定您没有受到任何损坏,最好重命名该文件。这可以保证来自其他进程的任何更改都不会影响处理。可能没有必要这样做 - 这取决于处理和文件的更新方式。但这是一种更安全的方法。移动或重命名操作保证是原子操作 - 因此如果使用这种方法,应该没有连续问题。

答案 2 :(得分:0)

更明确一点,如果你想要类似尾巴的行为,你需要:

  1. 打开文件,读入数据。保存长度。关闭文件。
  2. 等一下。
  3. 再次打开文件,尝试寻找最后一个读取位置,读取剩余数据,关闭。
  4. 冲洗并重复

答案 3 :(得分:0)

您可以使用inotify来观看文件更改。 如果您需要更简单的解决方案 - 读取文件属性(使用stat(),并检查文件的last_write_time)。

但是,您仍然可能会错过一些文件修改,而您将打开并重新读取文件。因此,如果您可以控制写入文件的应用程序,我建议您使用其他东西在这些进程之间进行通信,例如管道。