【发布时间】:2011-12-08 11:53:58
【问题描述】:
如果我创建stdout 流的dup(以便以后使用)并创建stdout 流的freopen 到文件然后printf("data"),文件不会立即更新与数据。只有在我执行fflush(stdout) 后才会更新。
fflush(stdout) 是否有一些额外的副作用?
有没有更优雅的方法来做到这一点?
【问题讨论】:
如果我创建stdout 流的dup(以便以后使用)并创建stdout 流的freopen 到文件然后printf("data"),文件不会立即更新与数据。只有在我执行fflush(stdout) 后才会更新。
fflush(stdout) 是否有一些额外的副作用?
有没有更优雅的方法来做到这一点?
【问题讨论】:
这是缓冲 I/O 中的正常行为。冲洗不会发生任何奇怪的事情。
但是,在这种情况下,您不应该弄乱标准输出。用fopen 打开你的文件,你会得到一个FILE 指针。在fprintf 等函数中使用此指针直接在其中打印,并在需要立即结果时刷新它。完成后不要忘记使用fclose 关闭文件。
【讨论】:
您可以使用对 C89 setvbuf() 的一次调用来避免将您的代码与 fflush() 混淆。或者也许是包装器setlinebuf()。
但以上所有只是刷新缓冲区。您可能需要使用fsync()。
【讨论】:
fflush vs fsync。
setvbuf() 与_IOLBF 一起使用通常就足够了——除非您有非常不寻常的要求。