我們知道引入標准IO庫的目的是為了提高IO的效率,避免頻繁的進行read/write系統調用,而系統調用會消耗較多的資源。因此標准IO庫引入了IO緩存,通過累積一定量的IO數據後,然後集中寫入到實際的文件中來減少系統調用,從而提高IO效率。標准IO庫會自動管理內部的緩存,不需要程序員介入。然而,也正是因為我們看不到標准IO庫的緩存,有時候會給我們帶來一定的迷惑性。這裡介紹下標准IO庫的緩存策略。
一。標准I/O的緩存--標准輸出為例:(這裡都是指缺省情況下)
1)當STDOUT連接到終端設備時,那麼它就是行緩存的,也就是標准IO庫沒看到一個新行符 \n時就刷新一次緩存(即執行一次實際的輸出操作)。這一特性可以通過如下測試代碼來驗證
int main()
{
printf("This Line Should be Cached...");
sleep(3); //這時候在終端上是看不到任何輸出
printf("\nThis Line Should be Cached Again"); //這時候可以看到第一個printf的輸出,因為被換行符刷新了
sleep(3); //這時候也只能看到一行輸出,而看不到第二個printf輸出的
printf("This Line Should Not be Cached Again\n"); //這時候可以看到第二個和第三個printf的輸出,因為被結尾的\n刷新
sleep(3);
getchar();
}
2)當STDOUT被重定向到一個具體文件時,那麼標准輸出是全緩存的,也就是說只有當輸出緩存被塞滿或者調用fflush或fclose時才會執行實際的寫入操作,這裡就不給出具體例子,可以通過freopen將STDOUT重定向到一個具體文件來進行測試。
二。標准出錯STDERR:為了盡快的看到出錯信息,標准出錯是不帶任何緩存的