在檔案io相關函式的一節中,我們所有的i/o函式都是圍繞著檔案描述符來操作的,當開啟乙個檔案的時候,即返回乙個檔案描述符,然後該檔案描述符用於後續的檔案操作。而對於標準io庫,對於檔案的操作都是圍繞這** 檔案流 file stream**進行的。當我們使用標準io庫開啟或建立乙個檔案的時候,我們已經使乙個流和乙個檔案進行關聯。
由於歷史原因,c語言中原來表示流的資料結構是file,而不是叫做流。由於大多數的庫函式使用到了file型別,有的時候在使用file指標的時候也叫其為流,這導致後來很多資料把file和流搞得十分混亂。實際上流就是標準io庫中程式與檔案互動的一種方式。
標準io函式fopen開啟乙個檔案時返回乙個指向file物件的指標,該物件通常是乙個結構,它包含了標準io庫為管理該流所需要的所有資訊,包括該檔案的檔案描述符,用於指向該流緩衝區的指標,緩衝區的長度,當前緩衝區中的字元數以及出錯標誌等等。
標準庫中對於每乙個程序都預定義了三個流,分別是stdin,stdout以及stderr,他們分別對應與linux檔案io中的stdin_fileno,stdout_fileno和stderr_fileno。它們的定義在stdio.h中
標準io提供緩衝的目的是為了通過減少使用read和write呼叫的次數來提高io讀寫的效率,它對每個io流自動的進行緩衝處理,從而避免了使用者程式在使用read和write需要考慮的這一點。
標準io流提供了三種緩衝。分別是全緩衝(fully buffering),行緩衝(line buffering)以及無緩衝(nonbuffering)。
在使用全緩衝的情況下,當資料填滿整個緩衝區之後才進行實際的io操作。對於駐留在磁碟上的檔案的讀寫通常是使用全緩衝。通常如果不給檔案流指定緩衝區的情況下,標準io函式會首先呼叫malloc函式獲取所需要的緩衝區。
在使用行緩衝的情況下,每當輸入輸出遇到換行或者緩衝區滿了的情況下才會進行實際的io操作,當涉及到終端輸入輸出的時候通常使用行緩衝。
對於行緩衝有兩個限制。1.由於接收行緩衝的緩衝區的長度是固定的,所以只要填滿了緩衝區,即使還沒有遇到換行符,也會進行io操作。2.任何時候,只要通過io庫要求從乙個不帶緩衝的流或者乙個行緩衝的流得到輸入資料,那麼就會沖洗所有緩衝輸出流。
###不帶緩衝
此時標準io庫不對字元進行緩衝儲存。這就使得輸入流要求io立即進行,如標準錯誤流,若果出現錯誤,會立馬輸出。
flush乙個流即重新整理緩衝區有兩個含義。##標準檔案流與緩衝型別之間的關係
我們可以通過一下兩個函式對將緩衝關閉或者改變緩衝的型別。其中這些函式應該在流被開啟之後呼叫,而且也應該在對流進行一切操作之前呼叫。
#include
void
setbuf
(file* restrict fd,
char
* restrict buf)
;int
setvbuf
(file* restrict fd,
char
* restrict buf,
int mode, size_t size)
;
使用setbuf函式開啟或者關閉緩衝,當buf是乙個有效緩衝區時,此時緩衝開啟,若流指向的是終端裝置,則此時該流是行緩衝的,否則該流是全緩衝的;當buf為null的時候,表示關閉該緩衝。
使用setvbuf可以精確的說明緩衝的型別,這裡是使用mode來說明的,mode的值包括以下幾個:
如果指定乙個不帶緩衝的流,則忽略buf和size引數。如果指定緩衝,則buf和size分別指定乙個緩衝區域和緩衝區域的長度。若此時buf為null,則標準io庫將自動制定乙個適合長度的緩衝區。
上述函式與緩衝之間的關係
函式mode
buf緩衝區及長度
緩衝型別
setbuf
非空長度為size的緩衝區buf
全緩衝或行緩衝
setbuf
null
無緩衝區
不帶緩衝
setvbuf
_iofbf
非空長度為size的緩衝區buf
全緩衝setvbuf
_iofbf
null
合適長度的緩衝區buf
全緩衝setvbuf
_iolbf
非空長度為size的緩衝區buf
行緩衝setvbuf
_iolbf
null
合適長度的緩衝區buf
行緩衝setvbuf
_ionbf
忽略無緩衝區
不帶緩衝
我們還可以通過fflush強制沖洗乙個流,此函式使該流所有未寫的資料都被傳送到核心。作為一種特殊的情況,當流的null時,所有的流將被沖洗:
#include
intfflush
(file* fd)
;
UNIX裡面關於標準IO的幾種緩衝機制
編寫背後 國嵌的那段時間,老范曾讓我們幫回答下論壇某個會員的問題,問題 出不來結果,沒任何列印資訊 如下 i nclude main 注意到,在 中printf語句列印的字串最後沒有帶換行符,而且最後呼叫了 exit函式,這導致了在終端螢幕上顯示不出來列印資訊。首先介紹一下unix裡面關於標準io的...
Unix中的不帶緩衝的檔案IO
unix中的一切都是檔案 這是乙個相當經典的定義,在unix以及unix的衍生系統中這一概念都是成立的。說一切都是檔案,指的是在unix中任何東西都是用檔案來表示的。在unix中裝置是檔案,socket是檔案,fifo是檔案,管道.也是檔案。其實個人理解說unix中的一切都是檔案其實是說在unix中...
檔案與IO 三 之緩衝流
首先要明確乙個概念 對檔案或其它目標頻繁的讀寫操作,效率低,效能差。使用緩衝流的好處 能夠更高效的讀寫資訊,原理是將資料先緩衝起來,然後一起寫入或者讀取出來。緩衝流的幾個方法 bufferedinputstream 為另乙個輸入流新增一些功能,在建立bufferedinputstream時,會建立乙...