为什么printf在调用后不刷新,除非格式字符串中有换行符?这是POSIX行为吗?如何让printf每次都立即刷新?
当前回答
这样做可能是为了提高效率,也因为如果有多个程序写入一个TTY,这样就不会让一行上的字符相互交错。所以如果程序A和B输出,你通常会得到:
program A output
program B output
program B output
program A output
program B output
这太糟糕了,但总比
proprogrgraam m AB ououtputputt
prproogrgram amB A ououtputtput
program B output
请注意,它甚至不保证在换行上刷新,因此如果刷新对您很重要,则应该显式刷新。
其他回答
stdout流在默认情况下是行缓冲的,因此只会在它到达换行符后(或当它被告知时)显示缓冲区中的内容。你有几个选项可以立即打印:
使用fprintf打印到stderrinstead (stderr默认是无缓冲的): fprintf(stderr,“我将立即被打印”); 在需要时使用fflush刷新标准输出: printf("Buffered, will flush "); 。fflush (stdout);//现在打印stdout缓冲区中的所有内容 使用setbuf禁用stdout的缓冲: setbuf (stdout, NULL); 或者使用更灵活的setvbuf: setvbuf(stdout, NULL, _IONBF, 0);
立即刷新调用fflush(stdout)或fflush(NULL) (NULL表示刷新所有内容)。
默认情况下,stdout是行缓冲,stderr是无缓冲,文件是完全缓冲。
你可以fprintf到stderr,这是无缓冲的。或者您可以在需要时刷新stdout。或者你可以将stdout设置为unbuffered。
使用setbuf(stdout, NULL);禁用缓冲。
推荐文章
- c++中size_t和int的区别是什么?
- 在C和c++中静态变量存储在哪里?
- errno线程安全吗?
- 如何在C程序中获取当前目录?
- 互斥实例/教程?
- 如何添加一个'或'条件在#ifdef
- 为什么在PHP中使用sprintf函数?
- extern关键字对C函数的影响
- 如果使用if-return-return或if-else-return?
- 转换Python程序到C/ c++代码?
- 为什么程序不是经常用汇编编写的?
- 有没有替换Windows (Visual C)的unistd.h ?
- 使用gcc命令行从.c文件构建.so文件
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?