轉載請注明出處:http://blog.csdn.net/qq_26093511/article/details/53255970
原因: ?輸出緩沖區的問題.
unix上標準輸入輸出都是帶有緩存的,一般是行緩存。
對于標準輸出,需要輸出的數據并不是直接輸出到終端上,而是首先緩存到某個地方,當遇到行刷新標志或者該緩存已滿的情況下,才會把緩存的數據顯示到終端設備上。
ANSI C中定義換行符'\n'可以認為是行刷新標志。所以,printf函數沒有帶'\n'是不會自動刷新輸出流,直至緩存被填滿。
linux 文件描述符,
解決方案:
方案1、在printf里加"\n"
方案2、fflush(stdout)刷新標準輸出緩沖區,把輸出緩沖區里的東西打印到標準輸出設備上 。
? fflush(stdout); // ?刷新一下緩沖區 讓它馬上輸出. ?在printf 之后調用它,就會馬上輸出了. ?
? setvbuf(stdout,NULL,_IONBF,0); //如果你嫌上個方法麻煩, 就使用這個函數. 直接將緩沖區禁止了. 它就直接輸出了。
這兩個函數都是有關流緩沖區的. 具體使用和說明網上有很多. ? 我只說一下什么是流緩沖區, 是做什么用的。
printf函數詳解。? 操作系統為減少 IO操作 所以設置了緩沖區. ?等緩沖區滿了再去操作IO. 這樣是為了提高效率。
下面是測試代碼:
方案1:
#include<stdio.h>
#include<unistd.h>void main()
{int i;for(i=0;i<10;i++){printf("\r %d%% is complete.\n",i);sleep(1);}printf("\n");
}
printf函數功能、
#include<stdio.h>
#include<unistd.h>void main()
{int i;for(i=0;i<10;i++){printf("\r %d%% is complete.",i);fflush(stdout);sleep(1);}printf("\n");
}
#include<stdio.h>
#include<unistd.h>void main()
{int i;setvbuf(stdout,NULL,_IONBF,0); //直接將緩沖區禁止了. 它就直接輸出了for(i=0;i<10;i++){printf("\r %d%% is complete.",i);sleep(1);}printf("\n");
}