printf flush问题

时间:2011-06-09 08:35:33

标签: c

我正在修改一个大的C代码。出于测试目的,我不得不将stdout重定向到文件。为此目的,我使用此代码剪切:fp=freopen("OUT", "w" ,stdout)现在所有printf调用都将写入fp。这是一个很大的代码,因此我不希望在每次退出之前搜索所有出口点并关闭文件。如果不关闭文件会发生什么?有没有办法在每次向文件写入内容时使其自动刷新?

2 个答案:

答案 0 :(得分:4)

setvbuf可能是要走的路:

setvbuf (fp, NULL, _IONBF, 0);

这将完全关闭缓冲。只是为不可避免的性能打击做好准备。

您还需要注意,这将仅在许多系统中的运行时库级别进行刷新,它不一定会导致刷新到存储介质,因为UNIX fsync(fileno(fp))会尝试这样做。 / p>

所以,虽然你的程序崩溃会好起来,但如果整个操作系统陷入尖叫堆中,它将无济于事。但是,你可能比输掉一点输出更大的问题: - )


但是,除非你的程序 崩溃,否则你可能不应该担心它。 ISO C99部分地说,exit()的一个行为,因此从main()返回,是:

  

接下来,刷新所有带有未写入缓冲数据的开放流,关闭所有打开的流,...

因此,无论如何都会输出您的数据。

答案 1 :(得分:1)

是。将setvbuf_IONBF

一起使用
setvbuf(stdout, 0, _IONBF, 0);