C C 檔案I O操作緩衝檔案操作

2021-10-08 03:44:06 字數 3132 閱讀 3544

緩衝區是為程式分配的記憶體塊,在進行資料量比較大且不要求實時性的 i/o 操作時,

一部分資料被置於緩衝區中,只有當資料的長度快要超過緩衝區範圍或時間週期達到時,

這些資料才被送入指定的位置。基於緩衝區的檔案 i/o 操作減少了對裝置的物理資料介面

訪問次數,從而使大量資料的 i/o 操作的系統開支減少,並將實際讀寫速度提公升。標準輸

入輸出庫定義了檔案流結構指標 file*作為檔案的標識,同時提供了一系列緩衝檔案操作

函式。有 3 個檔案流是系統預定義的,下面分別介紹

 stdin:標準輸入。

 stdout:標準輸出。

 dtderr:標準錯誤。

開啟與關閉檔案流

開啟檔案流操作的函式是 fopen(),該函式與系統呼叫函式 open()的作用相似,它主要

用於檔案和終端的輸入輸出方面,所以並不能對檔案許可權進行操作。該函式的一般形式是:

fopen(路徑,開啟方式);

開啟方式是一組字串,定義方法見表

字母 b 表示操作的是二進位制檔案,但在 linux 系統中並不區分文字檔案和二進位制檔案,

所以兩種操作實際是一樣的。如果函式執行成功,返回值是檔案流指標,否則返回 null。

當檔案不需要使用時,可用 fclose()函式將檔案關閉。該函式的一般形式是: fclose(文

件流指標)。當 fclose()函式執行時,所有放在緩衝區等待寫入的資料都將被寫入到檔案中。

如果資料未能被成功儲存, fclose()函式返回–1,否則返回 0。

讀取與寫入檔案流

讀取檔案流可使用函式 fread(),該函式的一般形式是:

fread(緩衝區指標, 長度, 數量, 檔案流指標);

緩衝區在程式中定義,定義後將指標作為引數傳遞給 fread()函式。引數中的長度是指

每次讀取到緩衝區內資料的長度,引數中的數量是讀取操作的最多次數。該函式的返回值

是讀取到緩衝區的次數,這個數字可能會小於引數中定義的最多次數。如果檔案的長度

大於 fread()函式實際讀取資料的長度,那麼實際讀取資料的總和為引數中長度與數量的

乘積。寫入檔案流可使用函式 fwrite(),該函式的形式與 fread()相同。這兩個函式不適用於操

作結構化資料的場合,例如運算元據庫中的表,原因是 fwrite()函式寫的檔案可能無法在不

同硬體平台之間移植。

如果待寫入的資料儲存在緩衝區中,而又要立即將緩衝區的資料寫入檔案,可使用

fflush()函式實現。該函式的一般形式是 fflush(緩衝區指標)。

fopen()函式沒有新建檔案的功能,所以必須先建立乙個空白檔案作為資料寫入的目標。

注意: 緩衝區的大小和每次運算元據的長度究竟該如何定義,這是乙個值得深入研究

的問題。很多進行大規模資料儲存的軟體可能會因為這兩個數值的設定而影響性

能。緩衝區並非限定了所操作檔案的最大規模,乙個大檔案可分次進行讀取和寫

入操作,所以緩衝區的大小最好由裝置的實際記憶體來決定。假設裝置的物理記憶體

為 1gb,那麼使用 1mb~100mb 的緩衝區都是合適的。每次運算元據的長度要

看訪問資料的**和去向,最好也依據實際硬體的效能來定,例如很多 sata 硬

盤一次讀取的資料量為 512kb, 那麼在程式中也可以將每次運算元據的長度設為

該值檔案流的格式化輸入與輸出

標準輸入輸出庫里提供了檔案流的格式化輸入輸出函式 fscanf()和 fprintf(),這兩個函

數的用法與 scanf()和 printf()函式極為相似。這兩個函式的一般形式是:

fscanf(檔案流指標, "控制字串", 輸入項列表);

fprintf(檔案流指標, "控制字串", 輸出項列表);

檔案流的定位操作

在標準輸入輸出庫里函式 fseek()與系統呼叫函式

seek()的定義方法和使用方法幾乎一致,只是 fseek()函式的第乙個引數是檔案流指標。除此

以外,標準輸入輸出庫還為定位操作提供了幾個函式

fpos_t 型別是標準函式庫中定義的一種結構體,它也是檔案流 file 結構體中的乙個成員。

檔案流操作的其他函式

檔案流操作的錯誤處理

在 c 語言中,很多函式都使用標準輸入輸出庫中定義的全域性變數 errno 儲存錯誤**。

當檔案流操作進行到檔案末尾時,也會通過 errno 變數儲存乙個資訊,這個資訊是標準輸

入輸出庫中定義的常量 eof。除此以外,其他檔案流操作的錯誤也會儲存在這個變數中。

與該變數相關的函式有 3 個,它們的一般形式如下:

ferror(檔案流指標);

feof(檔案流指標);

clearee(檔案流指標);

ferror()函式的作用是判斷檔案流操作是否失敗,失敗時返回非 0 值,否則返回 0。 feof()

函式的作用是當檔案流內指向檔案中位置的指標到達檔案尾,函式返回非 0 值,否則返回

0。 clearee()函式的作用是清除 errno 變數內的錯誤資訊。這 3 個函式的用法如下例所示。

檔案IO操作

在對乙個檔案或者裝置進行讀寫之前,都需要先開啟,以獲得該檔案或者裝置的操作指標,也就是檔案描述符。有了檔案描述符,後續就可以進行讀取,修改操作了。標頭檔案函式宣告 int open const char pathname,int flags,mode t mode 返回值成功 返回檔案描述符 失敗 ...

檔案操作IO

dup oldfd 和dup2 oldfd,newfd 這兩個函式我們可以用來複製檔案描述符。1 其中oldfd和newfd分別是複製前檔案描述符和複製後的檔案描述符。2 這兩個函式的呼叫都將複製檔案描述符oldfd,且他們的返回值都為新的檔案描述符。3 不同點是dup 的返回值是最小的未用檔案描述...

c語言 帶緩衝的檔案 I O操作

open操作 file fopen const char path,const char mode 作用 開啟乙個檔案流,開啟失敗則返回null file freopen const char path,const char mode,file stream 將乙個流進行重定向 file fdope...