1.适用范围
在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据再上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf
就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 print();
后加上fflush(stdout);
强制马上输出,避免错误。
2.原理概述
问题描述:
当一个任务往消息队列中发送一帧数据后,在另一个线程中读取数据并进入Switch
进行判断,发现第一帧数据没有获取到,只有第二针数据发过来后,第一帧数据才能打印信息。
解决描述:
经排查发现并不是消息队列存在问题,而是再Switch
判断语句中printf
函数中提前写了\n
换行符导致提前刷新了缓冲区,印后后面的信息就没有打印。
将打印的换行符\n
写到语句最后面或者在printf
函数下面添加函数fflush
刷新函数即可。
当printf
读进字符串的时候,并不会马上打印,而是先储存在buff
里面,当遇到下面4种条件的时候才进行打印:
1、程序结束 return 0;
或 exit(0);
2、遇到"\n
"
3、主动刷新 fflush(stdout);
4、缓冲区满。
3.解决方法
3.1换行符\n
如果需要输出前打印\n
,可以在输出信息后面再加一个\n
来刷新当前的缓存进行数据输出。如果不需要提前打印换行符,则只需要再输出信息后打印一个换行符\n
即可。
3.2fflush刷新缓存
第二种方式则是采用fflush
刷新当前的缓存来将未打印的信息刷新出来:
函数定义:
int fflush __P((FILE *));
函数说明:fflush()
会强迫将缓冲区内的数据写回参数指定的文件中.,如果参数为NULL
,fflush()
会将所有打开的文件数据更新。
其他用法:fflush()
也可用于标准输入(stdin)
和标准输出(stdout)
,用来清空标准输入输出缓冲区。stdin
是standard input的缩写,即标准输入,一般是指键盘;标准输入缓冲区即是用来暂存从键盘输入的内容的缓冲区。stdout
是standard output 的缩写,即标准输出,一般是指显示器;标准输出缓冲区即是用来暂存将要显示的内容的缓冲区。
函数功能:
清空标准输出缓冲区,刷新输出缓冲区,即将缓冲区的东西输出到屏幕上
如果圆括号里是已写打开的文件的指针,则将输出缓冲区的内容写入该指针指向的文件,否则清除输出缓冲区。
这里的stdout
是系统定义的标准输出文件指针,默认情况下指屏幕,那就是把缓冲区的内容写到屏幕上。