如何使fprintf()立即写入

写入文件的一种方法是使用fprintf() 。 但是,此函数不会立即将结果写入文件。 当程序终止或完成时,它似乎立即写入所有内容。

我的问题如下:我有一个需要很长时间才能运行的程序(大数据集需要4-5个小时)。 在此期间,我希望看到中间结果,这样我就不必等待5个小时。 我的大学使用Sun Grid Engine提交作业。 正如大多数人所知,你必须等到你的工作完成才能看到你的最终结果。 因此,我希望能够将中间结果写入文本文件,并在程序处理时查看更新的结果(类似地,如果我使用的是printf )。

如何修改fprintf()以将我想要的任何内容立即写入目标文件?

每次写入后都可以使用fflushfunction将输出缓冲区刷新到磁盘。

 fprintf(fileptr, "writing to file\n"); fflush(fileptr); 

如果您使用的是POSIX系统(即Linux,BSD等),并且您确实希望确保将文件写入磁盘,即您要刷新内核缓冲区以及用户空间缓冲区,请使用fsync

 fsync(fileno(fileptr)); 

但是fflush应该足够了。 除非你发现需要,否则不要打扰fsync

也许你可以设置FILE指针_IONBF模式。 然后你云不使用fflush或fsync。 FILE * pFilePointor = fopen(…); setvbuf(pFilePointor,NULL,_IONBF,0);

fprintf(…)fprintf(…)

fflush
这适用于文件*。 对于您的情况,它看起来更合适。 请注意fflush(NULL)将更新所有打开的文件/流和我的CPU密集型。 出于性能原因,您可能希望使用/ avoid fflush(NULL)。

FSYNC
这适用于int描述符。 它不仅更新文件/流,还更新元数据。 它甚至可以在系统崩溃/重启情况下工作。 您可以查看手册页以获取更多详细信息。

我个人使用fflush ,它对我来说很好(在Ubuntu / Linux中)。