Unix標準IO檔案流及緩衝型別

2021-09-16 21:14:18 字數 2447 閱讀 1888

檔案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時,會建立乙...