前面提到的所有i/o函式都是針對檔案描述符的。當開啟乙個檔案時,即返回乙個檔案描述符,然後該檔案描述符就用於後讀的i/o操作。而對於標準i / o庫,它們的操作則是圍繞流(s t r e a m)進行的。
為什麼要設計標準i/o庫?
直接使用api進行檔案訪問時,需要考慮許多細節問題
例如:read、write時,緩衝區的大小該如何確定,才能使效率最優
標準i / o提供快取的目的是盡可能減少使用r e a d和w r i t e呼叫的數量(見表3 – 1,其中顯示了在不同快取長度情況下,為執行i / o所需的c p u時間量)
標準i / o提供了三種型別的快取:
(1) 全快取。在這種情況下,當填滿標準i / o快取後才進行實際i / o操作。對於駐在磁碟上的檔案通常是由標準i / o庫實施全快取的。快取可由標準i / o例程自動地重新整理(例如當填滿乙個快取時),或者可以呼叫函式ff l u s h重新整理乙個流。
注意:重新整理有兩種意思。在標準i / o庫方面,重新整理意味著將快取中的內容寫到磁碟上(該快取可以只是區域性填寫的)。在終端驅動程式方面(例如在第11章中所述的t c f l u s h函式),重新整理表示丟棄已存在快取中的資料。
(2) 行快取。在這種情況下,當在輸入和輸出中遇到新行符時,標準i / o庫執行i / o操作。這允許我們一次輸出乙個字元(用標準i/o fputc函式),但只有在寫了一行之後才進行實際i / o操作。當流涉及乙個終端時(例如標準輸入和標準輸出),典型地使用行快取對於行快取有兩個限制。第乙個是:因為標準i / o庫用來收集每一行的快取的長度是固定的,所以只要填滿了快取,那麼即使還沒有寫乙個新行符,也進行i / o操作。第二個是:任何時候只要通過標準輸入輸出庫要求從( a )乙個不帶快取的流,或者( b )乙個行快取的流(它預先要求從核心得到資料)得到輸入資料,那麼就會造成重新整理所有行快取輸出流。
(3)不帶快取。標準i / o庫不對字元進行快取。如果用標準i / o函式寫若干字元到不帶快取的流中,則相當於用w r i t e系統呼叫函式將這些字元寫至相關聯的開啟檔案上。標準出錯流s t d e r r通常是不帶快取的,這就使得出錯資訊可以盡快顯示出來,而不管它們是否含有乙個新行字元。
ansi c要求下列快取特徵:
(1) 當且僅當標準輸入和標準輸出並不涉及互動作用裝置時,它們才是全快取的。
(2) 標準出錯決不會是全快取的。
其他根據各個系統的規定,對涉及互動裝置的緩衝處理方式。
對任何乙個給定的流,如果我們並不喜歡這些系統預設,則可呼叫下列兩個函式中的乙個更改快取型別:
setbuf、setvbuf
setbuf
可以使用s e t b u f函式開啟或關閉快取機制。為了帶快取進行i / o,引數buf 必須指向乙個長度為b u f s i z的快取(該常數定義在< s t d i o . h >中)。通常在此之後該流就是全快取的,但是如果該流與乙個終端裝置相關,那麼某些系統也可將其設定為行快取的。為了關閉快取,將b u f設定為n u l l。
函式原型
void setbuf(file *fp, char *buf);
引數和返回值
fp:fopen函式的返回值
buf:使用者提供的檔案緩衝區,其長度為bufsiz
若buf為null,則為無緩衝
若buf不為null,則為全緩衝
setvbuf
用於設定緩衝型別
函式原型
void setvbuf(file *fp, char *buf, int mode, size_t size);
使用s e t v b u f,我們可以精確地說明所需的快取型別。這是依靠m o d e引數實現的:
_iofbf 全快取
_iolbf 行快取
_ionbf 不帶快取
如果指定乙個不帶快取的流,則忽略buf 和size 引數。如果指定全快取或行快取,則buf和s i z e可以可選擇地指定乙個快取及其長度。如果該流是帶快取的,而buf 是n u l l,則標準i / o庫將自動地為該流分配適當長度的快取。
要了解,如果在乙個函式中分配乙個自動變數類的標準i / o快取,則從該函式返回之前,
必須關閉該流。
緩衝流之字元緩衝流
字元緩衝流 字元緩衝輸入流 bufferedreader 字元緩衝輸出流 bufferedwriter 完成文字資料的高效的寫入與讀取的操作 1字元緩衝輸出流 bufferedwriter void newline 根據當前的系統,寫入乙個換行符 public static void method0...
IO流 位元組緩衝流,字元緩衝流
處理流 裝飾流 位元組緩衝流,字元緩衝流 用於提高位元組流的效能 bufferedinputstream,bufferedoutputstream 位元組緩衝流 bufferedinputstream is newbufferedinputstream new fileinputstream fil...
緩衝流物件 緩衝流物件寫
這裡我們說一下常用的字元緩衝流物件,位元組緩衝流物件不常用。緩衝流物件寫 bufferrdreader 緩衝流物件讀 bufferred writer 如果想要使用想使用緩衝流來進行寫的操作就必須先使用字元流的寫操作。下面我們來看一下如何使用 來使用緩衝流物件進行寫。建立字元流讀取物件 需要檔案路徑...