在C中刷新缓冲区

saa*_*ame 54 c buffer fflush

如果fflush()不用于冲洗,即使它是一个输出流的缓冲区?

它有用的是什么?我们如何刷一般缓冲区?

Mik*_*ike 94

我从来没有听说过不刷新输出缓冲区,我很想听听你的消息来源.刷新输出缓冲区:

printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is
Run Code Online (Sandbox Code Playgroud)

要么

fprintf(fd, "Buffered, will be flushed");
fflush(fd);  //Prints to a file
Run Code Online (Sandbox Code Playgroud)

可以是一个非常有用的技术.为什么要刷新输出缓冲区?通常当我这样做时,这是因为代码崩溃,我正在尝试调试某些东西.标准缓冲区不会在每次调用printf()时打印,直到它已满,然后立即转储一堆.因此,如果你试图在崩溃之前检查你是否正在进行函数调用,那么对于printf像"到达这里!" 这样的东西是有帮助的,有时缓冲区在崩溃发生之前还没有被刷新,你可以'告诉你到底有多远.

另一个有用的时间是多进程或多线程代码.同样,缓冲区并不总是在调用a时刷新printf(),所以如果你想知道多个进程的真正执行顺序,你应该在每次打印后刷新缓冲区.

我养成了这样做的习惯,这让我在调试时省去了很多麻烦.我能想到的唯一缺点是这printf()是一个昂贵的操作(这就是为什么它默认不刷新缓冲区).


只要刷新输入缓冲区(stdin),就不应该这样做.潮红stdin是根据C11标准§7.21.5.2部分2未定义的行为:

如果流指向输出流... fflush函数会导致该流的任何未写入数据...被写入文件; 否则,行为未定义.

在某些系统上,正如您在手册页中看到的那样,Linux是一个fflush()定义的行为,但它依赖于系统,因此您的代码将无法移植.

现在,如果您担心垃圾"卡在"输入缓冲区中,您可以使用fpurge()它.有关更多信息,请参阅此处fflush()fpurge()

  • 如果我要调试程序并查看它是否到达某个语句,则只需执行fprintf(stderr,“ got here!\ n”);`。由于`stderr`没有被缓冲,它将被立即打印。 (2认同)