以下內容在Linux測試,Window因爲沒遵循POSIX,所以現象會有不同。
一、前言
首先,printf緩衝區的問題,平時不大會發現,當時是在使用sleep函數時出現的。先來看一下問題。
#include <stdio.h>
int main()
{
printf("hello\n");
sleep(1); //延遲1秒
printf("world\n");
return 0;
}
上面的代碼正常輸出:
hello
world
兩個之間間隔一秒輸出
接下來做一下修改:
#include <stdio.h>
int main()
{
printf("hello"); /*去掉轉義字符'\n'*/
sleep(1);
printf("world\n");
return 0;
}
上面的代碼輸出爲:
helloworld
但是輸出卻是延遲一秒之後纔將helloworld一起輸出
當我們去掉轉義字符‘\n’,延遲函數sleep不再在語句間延遲,而是變成延遲整個程序。
二、深入理解printf
printf是一個行緩衝函數,先寫到緩衝區,滿足一定的條件後,纔會將緩衝區內容輸出到對應文件中,如下幾個條件可以刷新緩衝區:
1 緩衝區填滿。
2 寫入的字符中有‘\n’ , ‘\r’。
3 調用fflush手動刷新緩衝區。
4 調用scanf要從緩衝區中讀取數據時,也會將緩衝區內的數據刷新。
5 調用printf函數的進程或線程結束會調用fflush函數
接下來我們修改一下程序
include <stdio.h>
int main()
{
printf("hello");
fflush(stdout); //強制刷新緩存,輸出顯示
sleep(1);
printf("world\n");
return 0;
}
這個時候的效果就是先輸出hello,然後1秒之後再輸出world。