標準I O緩衝

2021-06-04 11:34:24 字數 1099 閱讀 8319

ansi c裡定義的標準i/o是一種帶緩衝的高階磁碟i/o,目的是盡可能減少使用read和write系統呼叫的次數,從而提高i/o效率.標準i/o提供了3種型別的緩衝型別.

● 全緩衝.在這種情況下,當填滿標準i/o快取後才進行實際i/o操作.對駐留在磁碟上的檔案的訪問通常是由標準i/o庫實施全緩衝的.

● 行緩衝.在這種情況下,當在輸入和輸出中遇到新行符時,標準i/o庫執行i/o操作,這允許我們一次輸出乙個字元(如fputc函式),但只有寫了一行之後才進行實際i/o操作.當流涉及乙個終端時(例如標準輸入和標準輸出),典型地使用行緩衝.

● 不帶緩衝.標準i/o庫不對字元進行緩衝.如果用標準i/o函式寫若干字元到不帶緩衝的流中,則相當於用write系統呼叫將這些字元寫到開啟的檔案上.標準出錯況stderr通常是不帶快取的,這就

這裡強調一下,所謂的帶不帶緩衝指的是不同的流而不是函式.比如駐留在磁碟上的檔案流是全緩衝的方式,標準輸入/輸出流預設是行緩衝而標準錯誤不帶緩衝.

行緩衝是指當遇到換行符』n』或一行滿時,才真正的進行i/o操作.linux預設情況下一行最多容納1024個字元,當超出這個範圍時,即使沒有遇到換行符,也引起實際的i/o操作.

對於全緩衝來說,讀寫操作是按照預設的緩衝區大小(4k)進行的.具體說就是從流讀取內容時每次讀取4k大小的內容到緩衝區,而程式是從緩衝區裡讀取資料的.當緩衝區裡的資料處理完後再從流裡讀取4k的內容到緩衝區.分析下面的例子:

file *fp;

char buf[8192] = ; // 緩衝區初始化為0

char ch;

if ( (fp=fopen (「data.txt」, 「r 」)) == null )

setvbuf(fp, buf, _iofbf, 4096); // 設定流fp為全緩衝,緩衝區指向buf,大小為4096

fread(&ch, 1, 1, fp); // 從流中讀取乙個位元組的內容存放到變數ch中

printf(「%d %d %dn」, buf[0], buf[1], buf[4095]);

雖然程式中只讀取了1個位元組,但實際上讀取了4k的內容存放到buf中.

寫檔案的情況類似,當緩衝區寫滿內容時才會引起實際的i/o操作,檔案被更新.

又讀又寫的情況比較特殊.

標準IO緩衝

一 問題描述 終端無輸出結果。二 分析問題 1.標準輸出 stdout 是行緩衝模式。其何時會輸出在於 printf裡有 n fflush stdout 或setbuf stdout,null 緩衝區已滿三種。在應用程式退出時 exit 會ffush緩衝區。2.上述程式,如果將sleep 1 usl...

標準I O緩衝機制

標準i o庫提供緩衝的目的是盡可能減少使用read和write呼叫的次數。它對每個io流自動的進行緩衝管理,從而避免了應用程式需要考慮這一點所帶來的麻煩。不幸的是,標準io庫最令人迷惑的也是他的緩衝。標準io提供了3種緩衝機制 1 全緩衝。這種情況下,在填滿標準io緩衝區後才進行實際io操作。對於駐...

標準I O緩衝 全緩衝 行緩衝 無緩衝

說明 我只對網路資源進行了整合,方便學習 基於流的操作最終會呼叫read或者write函式進行i o操作。為了使程式的執行效率最高,流物件通常會提供緩衝區,以減少呼叫系統i o庫函式的次數。基於流的i o提供以下3種緩衝 全緩衝 直到緩衝區被填滿,才呼叫系統i o函式。對於讀操作來說,直到讀入的內容...