我正在读一个大约40000行的~2mb CSV文件,每行定义一个列表中的对象,我需要将输入文件的任何更改反映到我的列表中,反之亦然......如果我修改了一个输入文件中的行我需要更新列表中的对象,对对象的修改将立即反映到文件中。 我知道它可以在无限循环中完成,但它相当浪费资源和听起来很荒谬。是否有一个函数或更新标志,我可以检查或其他方法,我只在更新时读取文件? 我顺便用C ++编写代码:)
EDITED
我用@Jake提出的代码玩了一段时间,然后提出了一个有效的解决方案。这是一个更好的问题然后...我写的代码似乎有时立即工作,但有时它不会更新我对文件的修改,因为我保存文件,只有在保存文件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);
}
return 0;
}
答案 0 :(得分:2)
使用Linux,您可以使用以下代码判断文件是否已更新:
auto getFileCreationTime(char *filePath)
{
struct stat attrib;
stat(filePath, &attrib);
char date[10];
strftime(date, 10, "%d-%m-%y", gmtime(&(attrib.st_ctime)));
return date;
}
所以使用线程和while语句你可以做这样的事情
auto mod_time_first = getLastTime();
while(true)
{
if(mod_time_first == getLastTime()) {} // Do something now
mod_time_first = getLastTime();
}