使用没有无限循环的 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++17 std::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 检测文本文件中的更改?的主要内容,如果未能解决你的问题,请参考以下文章

C++控制台程序怎样使主函数无限循环

如何在 C++ 中使用 Detours 扩展程序内函数而不进入无限循环?

C++ 循环!循环类型+循环控制语句+无限循环!

c ++处理来自输入文件的数据会创建无限循环

x86-64 汇编器中的无限循环

我想通过在 C++ 中使用向量来获取用户输入,但我得到了无限循环