写入文件的一种方法是使用fprintf()
。但是,此功能不会将结果写入文件立即。当程序终止或完成时,它似乎立即写入所有内容。
我的问题如下:我有一个需要很长时间才能运行的程序(大数据集需要4-5个小时)。在此期间,我希望看到中间结果,这样我就不必等待5个小时。我的大学使用Sun Grid Engine
提交工作。正如大多数人所知,你必须等到你的工作完成才能看到你的最终结果。因此,我希望能够将中间结果写入文本文件,并在程序处理时查看更新的结果(类似地,如果我使用printf
)。
如何修改fprintf()
以便将立即写入目标文件?
答案 0 :(得分:8)
每次写入后都可以使用fflush
函数将输出缓冲区刷新到磁盘。
fprintf(fileptr, "writing to file\n");
fflush(fileptr);
如果您使用POSIX系统(即Linux,BSD等),并且真的想要确保将文件写入磁盘,即您要刷新内核缓冲区以及用户空间缓冲区也使用fsync
:
fsync(fileno(fileptr));
但fflush
应该足够了。除非您发现需要,否则不要为fsync
而烦恼。
答案 1 :(得分:1)
也许你可以设置FILE指针_IONBF模式。然后你云不使用fflush或fsync。 FILE * pFilePointor = fopen(...); setvbuf(pFilePointor,NULL,_IONBF,0);
fprintf中(......) fprintf中(...)
答案 2 :(得分:0)
<强> fflush 强>
这适用于文件*。对于您的情况,它看起来更合适。请注意fflush(NULL)将更新所有打开的文件/流和我的CPU密集型。出于性能原因,您可能希望使用/ avoid fflush(NULL)。
<强> 的fsync 强>
这适用于int描述符。它不仅更新文件/流,还更新元数据。它甚至可以在系统崩溃/重启情况下工作。您可以查看手册页以获取更多详细信息。
我个人使用 fflush ,它对我来说很好(在Ubuntu / Linux中)。