我正在使用64位Ubuntu 16.04并在我的代码中尝试将输入文件的任何更新反映到我的程序中。我写了这个似乎有用的测试代码;当我对输入文件进行更改并保存文件时,我通常可以在控制台上看到更新。但有时它会在保存3-5次后更新,即使我多次保存更改也不会更新。我使用了什么错误,可能导致这种行为的原因是什么?有没有更好的方法呢?
#include <iostream>
#include <fstream>
#include <sys/stat.h>
#define INFILE "test.txt"
using namespace std;
__time_t getFileModifyTime(char *filePath)
{
struct stat attrib;
stat(filePath, &attrib);
__time_t date = attrib.st_mtime ;
return date;
}
int main(){
ifstream infile;
infile.open (INFILE);
string currentLine;
__time_t lastUpdateTime = 0;
while(true) // start an infinite loop
{
if(lastUpdateTime != getFileModifyTime(INFILE)) {
cout << "last update time : " << lastUpdateTime << endl;
cout << "modification time : " << getFileModifyTime(INFILE) << endl;
infile.close();
infile.open (INFILE);
while (getline(infile, currentLine)) {
cout << currentLine << endl;
}
}
lastUpdateTime = getFileModifyTime(INFILE);
}
// if a miracle happens
return 0;
}
答案 0 :(得分:0)
我使用的是错误的东西吗,可能是什么原因引起的?
是-您无法检查stat()
的返回值。一些流行的编辑器,当您保存文件时,将其重命名为备份名称并编写一个新文件(然后甚至可能删除并看不到备份),因此在{{ 1}}名称不存在,并且INFILE
失败,但是仍使用未初始化的stat()
,导致行为未定义。对于最小的更改,请打印错误以查看是否发生这种情况,并使attrib.st_mtime
定义为attrib
:
static
也就是说,有时仅在保存3-5次后才更新的原因是另外一个原因:
static struct stat attrib;
if (stat(filePath, &attrib) < 0) perror(INFILE);
如果在两个 if(lastUpdateTime != getFileModifyTime(INFILE)) {
…
}
lastUpdateTime = getFileModifyTime(INFILE);
调用之间修改了文件,则更改不会引起注意。为了使更改最小,请将第二个调用移到getFileModifyTime()
块的开头:
if
有更好的方法吗?
使用inotify
肯定会更好。