我打算用C ++读取一个文件。读取本身发生在while循环中,并从一个文件读取。
当函数从文件中读取信息时,它会将此信息推送到系统中的某个位置。问题是当循环正在进行时,此文件可能会更改。
我如何在文件中捕获新信息?我尝试了std::ifstream
在我的计算机上手动阅读和更改我的文件,因为无限循环(每个循环之间有一个sleep(2)
)正在进行中,但正如预期的那样 - 没有任何事情发生。
编辑:文件将在每个新的数据条目覆盖自己。
帮助?
在虚拟机Ubuntu Linux 12.04上运行,如果这可能是有用的信息。这不是家庭作业。
答案 0 :(得分:1)
通常的解决方案与MichaelH的方式相同 建议:写入过程以追加模式打开文件,并且 总是写到最后。阅读过程做了什么 迈克尔赫建议。
这适用于每次运行中的少量数据。如果 进程应该运行很长时间,并产生很多 数据,文件最终会变得太大,因为它会 包含所有已处理的数据。在这种情况下, 解决方案是使用目录,在其中生成编号文件, 每个数据记录一个文件。写作过程将写入每个 数据设置为新文件(递增数字),以及 读取过程将尝试打开新文件,并将其删除 什么时候结束这比复杂得多 第一个建议,但即使是流程也会有效 每秒生成大量数据并运行 年份。
编辑:
OP后来的评论说该设备实际上是一个FIFO。 在那种情况下:
你不能寻求,所以MichaelH的建议不能使用 字面意思,但
您无需搜索,因为数据会自动删除 无论何时读取,都来自FIFO,
取决于数据的大小及其编写方式 写入可能是原子的,因此您不必担心部分 记录,即使你碰巧正好在中间阅读 写作。
关于后者:确保同时阅读和
写缓冲区足够大,可以包含完整的记录
作者在每张唱片后冲了过来。并确保
记录小于保证所需的大小
原子。 (从历史上看,在早期的Unix上,我知道,这是
4096,但如果它没有增加,我会感到惊讶
然后。虽然......在Posix下,这是由PIPE_BUF
定义的,
只能保证至少512,而且只有4096
在现代Linux下。)
答案 1 :(得分:0)
只需读取文件,重命名文件,打开重命名的文件即可。处理数据到您的系统,并在循环结束时关闭文件。睡眠后,重新打开白色循环顶部的文件,重命名并重复。
这是解决问题的最简单方法,可以节省编写代码以在处理阶段处理文件的动态更改。
要绝对确定您没有受到任何损坏,最好重命名该文件。这可以保证来自其他进程的任何更改都不会影响处理。可能没有必要这样做 - 这取决于处理和文件的更新方式。但这是一种更安全的方法。移动或重命名操作保证是原子操作 - 因此如果使用这种方法,应该没有连续问题。
答案 2 :(得分:0)
更明确一点,如果你想要类似尾巴的行为,你需要:
答案 3 :(得分:0)
您可以使用inotify来观看文件更改。 如果您需要更简单的解决方案 - 读取文件属性(使用stat(),并检查文件的last_write_time)。
但是,您仍然可能会错过一些文件修改,而您将打开并重新读取文件。因此,如果您可以控制写入文件的应用程序,我建议您使用其他东西在这些进程之间进行通信,例如管道。