使用没有无限循环的 C++ i 检测文本文件中的更改?
Posted
技术标签:
【中文标题】使用没有无限循环的 C++ i 检测文本文件中的更改?【英文标题】:Detect change in text file using C++ i without Infinite Loop? 【发布时间】:2018-02-03 13:45:11 【问题描述】:我正在使用 C++ 读取文本文件。我使用第一行来指示文件是否已更改。例如,文本文件将如下所示:
0
9
更改文本文件后,我将翻转第一行。因此,新的文本文件将如下所示:
1
5
C++ 代码将在从文本文件读取新输入后执行其功能。目前,我正在使用无限循环来检测文本文件中的更改。是否有使用 C++ 检测文本文件更改的替代实现?到目前为止,这是我的解决方案:
do
std::ifstream reader;
reader.open(READFILE);
if (!reader)
printf("Error opening the reader file!!");
exit(1);
reader >> status >> variable;
if(status != reader_file_status)
reader_file_status = status;
return true
while(true);
【问题讨论】:
许多操作系统允许安装类似inotify 文件监视机制的东西。你仍然会有一个无限循环,但它会一直处于阻塞调用中,直到你收到通知说某些事情发生了变化。除此之外,您的问题在很大程度上取决于您的实际操作系统,并且过于宽泛,无法为您提供真正好的建议。您使用 c++ 进行实现是一个几乎无关紧要的细节,c++ 标准根本不支持这种(甚至不支持实验性 c++17std::filesystem
)机制。
这样的外部更改会修改文件时间吗?它的大小? (你确定你的代码是线程安全的吗?)
大多数操作系统都具有检测文件更改的功能。例如 Windows 上的 FindFirstChangeNotification。
我正在运行 MiniSAT 并进行了一些修改。我认为它使用线程来加快搜索过程。我认为它可能正在改变时间。
@mousecoder inotify 支持 C-API,因此它可以与您的 c++ 代码无缝集成,文档中有大量示例,并且遍布整个 interwebz。只是谷歌它。 “另外,我能达到任何效率吗……” 当然,正如我所提到的,您将坐在阻塞电话中。
【参考方案1】:
文件系统更改事件是特定于平台的,因此您需要针对不同平台使用不同的解决方案。
osx: 文件系统事件APIdoc freebsd/osx: kqueue doc linux:inotifydoc windows:windows apidoc似乎有一些跨平台包装。快速谷歌搜索显示:
https://github.com/emcrisostomo/fswatch (gpl3, osx/freebsd/linux/windows/solaris) http://doc.qt.io/archives/qt-4.8/qfilesystemwatcher.html (lgpl, osx/freebsd/windows)【讨论】:
以上是关于使用没有无限循环的 C++ i 检测文本文件中的更改?的主要内容,如果未能解决你的问题,请参考以下文章