为什么printf在调用后不刷新,除非格式字符串中有换行符?这是POSIX行为吗?如何让printf每次都立即刷新?
当前回答
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);
其他回答
Stdout是缓冲的,因此只在打印换行符后输出。
要获得立即输出,可以:
打印到标准错误。 使stdout无缓冲。
注意:Microsoft运行时库不支持行缓冲,因此printf(“将立即打印到终端”):
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setvbuf
使用setbuf(stdout, NULL);禁用缓冲。
立即刷新调用fflush(stdout)或fflush(NULL) (NULL表示刷新所有内容)。
这样做可能是为了提高效率,也因为如果有多个程序写入一个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
请注意,它甚至不保证在换行上刷新,因此如果刷新对您很重要,则应该显式刷新。
推荐文章
- C多行宏:do/while(0) vs作用域块
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- main()中的Return语句vs exit()
- 如果不是内存地址,C指针到底是什么?
- 我如何在Visual Studio中预处理后看到C/ c++源文件?
- 保护可执行文件不受逆向工程的影响?
- 从C语言的函数返回一个struct
- C99 'restrict'关键字的实际用法?
- 检查子字符串存在于C中的字符串中
- 从标准输入中捕获字符,而不需要等待按enter键
- 查找当前可执行文件的路径,不包含/proc/self/exe