在C中刷新缓冲区

在C中刷新缓冲区,c,buffer,fflush,C,Buffer,Fflush,即使缓冲区是输出流,也不应该使用fflush()刷新缓冲区吗 它有什么用处?通常如何刷新缓冲区?刷新输出缓冲区: printf("Buffered, will be flushed"); fflush(stdout); // Prints to screen or whatever your standard out is 或 这是一种非常有用的技术。为什么要刷新输出缓冲区?通常当我这么做的时候,是因为代码崩溃了,而我正试图调试一些东西。标准缓冲区不会在每次调用printf()时打印,它会一直

即使缓冲区是输出流,也不应该使用
fflush()
刷新缓冲区吗


它有什么用处?通常如何刷新缓冲区?

刷新输出缓冲区:

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

这是一种非常有用的技术。为什么要刷新输出缓冲区?通常当我这么做的时候,是因为代码崩溃了,而我正试图调试一些东西。标准缓冲区不会在每次调用
printf()
时打印,它会一直等到它满了,然后立即转储一堆。因此,如果您试图在崩溃之前检查是否正在进行函数调用,
printf
类似于“got here!”,这是很有帮助的,而且有时在崩溃发生之前缓冲区还没有刷新,您无法判断自己到底完成了多远

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

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


至于刷新输入缓冲区(
stdin
),您不应该这样做。冲洗
stdin
是C11标准§7.21.5.2第2部分中未定义的行为:

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

在某些系统上,Linux是一个,正如您在的手册页中所看到的,它有一个已定义的行为,但它依赖于系统,因此您的代码将不可移植

现在,如果您担心垃圾“卡在”输入缓冲区中,您可以在上面使用
fpurge()

有关
fflush()
fpurge()

的详细信息,请参阅。请注意,fflush仅为输出流定义良好,不能用于输入流:这将是未定义的行为。@saadtaame是的,这正是
fflush()
的用途。@BrunoKim:See和
fflush(stdout)
不会对stdin产生任何影响,因此不会丢失任何输入<就我所能找到的任何标准中都没有提到code>fpurge。如果我试图调试一个程序并查看它是否达到某个语句,我只需执行
fprintf(stderr,“got here!\n”)。由于未缓冲
stderr
,因此将立即打印它。
fprintf(fd, "Buffered, will be flushed");
fflush(fd);  //Prints to a file