printf緩衝區刷新問題

以下內容在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。

發佈了119 篇原創文章 · 獲贊 66 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章