树莓派C语言调用printf每秒打印数字却每10秒批量输出问题咨询
问题原因
C语言在Linux环境下(包含树莓派的Linux发行版)的标准输出stdout默认采用行缓冲机制,满足以下任意条件才会将缓冲区的内容真正输出到终端:
- 缓冲区被写满
- 遇到换行符
\n - 程序结束退出时自动刷新
- 代码主动调用缓冲刷新函数
你的代码中,每次循环执行printf("%d ", i);输出的内容末尾没有换行符,只有当i%10 == 1时才会输出\n触发缓冲刷新,因此每10次循环(间隔10秒)才会一次性输出一整行的10个数字,和你预期的逐秒输出不符。
解决方案
两种常用修复方案,任选一种即可:
- 每次打印后主动刷新标准输出缓冲区:在
printf("%d ", i);后新增一行fflush(stdout);即可,该函数已包含在stdio.h中无需额外引入头文件。 - 程序启动时直接关闭标准输出的缓冲机制:在
main函数最开头新增一行setbuf(stdout, NULL);,之后所有输出都会直接写入终端,无需等待缓冲条件触发。
修改后参考代码
#include <stdio.h> #include <wiringPi.h> #include <softPwm.h> int main(void) { wiringPiSetupGpio(); for(int i = 0 ; i <50; i++) { if ( i%10 == 1) { printf("\n"); } printf("%d ", i); fflush(stdout); // 新增缓冲刷新逻辑 delay(1000); } return 0; }
内容的提问来源于stack exchange,提问作者wdy0308
相关产品推荐
相关产品推荐

