標準IO庫操作是圍繞著流來進行的,當我們通過fopen標準IO庫函數開啟一個檔案,我們就使一個檔案和一個IO流相關聯。在這裡我們把IO流和檔案指標FILE*等同起來,因為所有針對IO流的操作都是通過FILE*指標來實現的。
我們知道引入標準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:為了儘快的看到出錯資訊,標準出錯是不帶任何緩衝的
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/whrail/archive/2010/09/01/5856083.aspx