在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