2017-07-27 222 views
3

写入文件的一种方法是使用fprintf()。但是,此功能不会将结果写入文件立即。它似乎在程序终止或结束时立即写入所有内容。如何使fprintf()立即写入

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

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

+6

使用'fflush'功能 –

+0

@ M.M之前没有见过这个功能。非常感谢你 – Medo

+0

另请参见[C中自动刷新标准输出缓冲区的规则是什么?](https://stackoverflow.com/q/39536212/2410359)。 – chux

回答

7

您可以在每次写入后使用fflush函数将输出缓冲区刷新到磁盘。

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

如果你是一个POSIX系统(即Linux的,BSD等)上,您真的要确保文件被写入磁盘,即要刷新内核缓冲区以及作为用户空间的缓冲区,也可以使用fsync

fsync(fileno(fileptr)); 

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

+0

真的!那简单! – Medo

+0

非常感谢。很好解释。 – Medo

+0

是不是'fsync'只适用于POSIX? – stackptr

0

fflush
这适用于FILE *。你的情况看起来更合适。请注意fflush(NULL)将更新所有打开的文件/流,并且我的CPU密集型。出于性能原因,您可能想要使用/避免fflush(NULL)。

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

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

0

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

fprintf中(...) fprintf中(...)