我们知道,C语言中,write和printf都可以完成向屏幕输出的任务。
但是write是不带缓冲的输出,printf是带缓冲的输出。当它们二者混用时,就会出现一些意料之外的问题。
请看下面的代码
#include <stdio.h>
#include <unistd.h>
int main(){
printf("1");
write(STDOUT_FILENO, "2", 1);
printf("3");
write(STDOUT_FILENO, "4", 1);
printf("5\n");
write(STDOUT_FILENO, "6", 1);
return 0;
}
按照程序的执行流程,输出的结果应该是"12345[换行]6"。
但是实际上屏幕的输出结果是"24135[换行]6"
原因是这样的,write函数不带缓冲区,因此每当程序执行到write函数时,就会立即向屏幕输出。而printf是带缓冲区的,只有当缓冲块满或是遇到换行符,才会将缓冲区的内容一并向屏幕输出。
为了避免这种情况,不应将两种输出函数混用,或者是对于printf出的不以换行符结尾的字符串,用一个fflush函数强制清空缓冲区,输出到屏幕上,就得到下面的代码。
#include <stdio.h>
#include <unistd.h>
int main(){
printf("1");
fflush(stdout);
write(STDOUT_FILENO, "2", 1);
printf("3");
fflush(stdout);
write(STDOUT_FILENO, "4", 1);
printf("5\n");
write(STDOUT_FILENO, "6", 1);
return 0;
}
//PRINT: 12345 \n 6