C語言中的檔案操作

2021-07-27 07:28:01 字數 3594 閱讀 8967

一、檔案

檔案(file)一般指儲存在外部介質上資料的集合,從不同的角度可對檔案作不同的分類。根據儲存規則可以將其分為***、mp4、txt、bmp、jpg、exe、rmvb等檔案。從使用者的角度看,檔案可分為普通檔案和裝置檔案兩種:普通檔案是指駐留在磁碟或其它外部介質上的乙個有序資料集;裝置檔案是指與主機相聯的各種外部裝置,如顯示器、印表機、鍵盤等。從檔案編碼的方式來看,檔案可分為ascii碼檔案和二進位製碼檔案兩種。

ascii檔案也稱為文字檔案,這種檔案在磁碟中存放時每個字元對應乙個位元組,用於存放對應的ascii碼。比如ini、h、c等檔案都是文字檔案。例如,數5678的文字儲存形式為每個數字的ascii碼:00110101 00110110 00110111 00111000佔是個位元組。二進位制檔案是按二進位制的編碼方式來存放檔案的。 例如, 數5678的儲存形式為: 00010110 00101110只佔二個位元組。

二、c語言檔案操作

利用c語言進行檔案操作的常用方法有三種:

(1)利用c語言的標準庫進行檔案操作。

(2)在unix環境下,可以利用unix系統介面,利用open,read,write等低階系統i/o進行檔案操作。

(3)在windows下可以利用fopen_s,fscanf_s等庫函式的安全版本進行檔案操作。  

1、利用c的標準i/o庫進行檔案操作

<1> 流與檔案指標

標準i/o庫是圍繞流進行的。c語言操作檔案可以是位元組流或者二進位製流。但是c系統在處理這些檔案時,並不區分型別,都看成是字元流,按位元組進行處理。 輸入輸出字元流的開始和結束只由程式控制而不受物理符號(如回車符)的控制。 

標準i/o庫開啟或建立乙個檔案時,我們已使乙個檔案流與乙個檔案相關聯。通過fopen開啟乙個檔案時,會返回乙個指向該檔案的指標稱為檔案指標。檔案指標指向乙個包含檔案資訊的結構,這些資訊包括緩衝區的位置、緩衝區中當前字元的位置、檔案的讀或寫狀態、是否出錯或是否到達檔案結尾等等。檔案指標用file*來描述

struct _iobuf ;

typedef struct _iobuf file;

對於ascii碼字符集,乙個字元用乙個位元組表示。對於國際字符集,乙個字元可用多個位元組表示。標準i/o檔案流可用於單位元組或多位元組字符集。流的定向決定了讀的是乙個單位元組或多位元組的。當乙個流最初被建立時,它並沒有定向。如若在未定向的流上使用乙個多位元組i/o函式(見),則流的定向設定為寬定向。若在未定向的流上使用乙個單位元組的i/o函式,則將該流定向為位元組定向。

fwide函式可用於設定流的定向。而freopen函式可用於清除乙個流的定向。

int fwide(

file *stream,

int mode;

);

啟動乙個c語言程式時,作業系統環境會開啟標準輸入、標準輸出和標準錯誤3個檔案,相應的檔案指標分別為stdin、stdout和stderr(檔案指標stdin/stdout都是file*型別的物件,但它們是常量而非變數,不能對它們賦值)。在大多數環境中,stdin指向鍵盤,而stdout和stderr指向顯示器。當然也可以被重定向到檔案或者管道。

大多數系統都限制了可以同時開啟的檔案數。因此不使用時要及時關閉掉檔案指標。

< 2 >檔案緩衝

標準i/o庫提供了緩衝,目的是盡可能的減少使用read和write呼叫的次數。標準i/o庫提供了三種型別的緩衝

1)全緩衝。在填滿標準i/o緩衝後才進行實際i/o操作。

2)行緩衝。在輸入輸出遇到換行符時,標準i/o庫執行i/o操作。

行緩衝的限制:①因為標準i/o庫用來收集每一行緩衝區的長度是固定的,所以只要填滿了緩衝區,那麼即使還沒有寫乙個換行符,有進行i/o操作。②任何時候只要通過標準i/o庫要求從乙個不帶緩衝的流或者乙個行緩衝的流得到輸入資料,那麼就會沖洗所有的緩衝輸出流。

3)不帶緩衝。標準i/o庫不對字元進行緩衝儲存。

系統預設的緩衝:

1)標準錯誤不帶緩衝

2)若是指向終端的裝置的流,則進行行緩衝

3)否則進行全緩衝

[1] 更改緩衝型別和大小

(1) setbuf

1) 函式原型

void setbuf(

file *stream,

char *buffer

);

2)引數說明

stream 為已開啟的檔案指標,並且還沒有被讀或者寫

buffer為緩衝區的位址。緩衝區的大小為bufsize(該常量定義在中)。

buffer為null時,將關閉緩衝

3)說明

通常呼叫該函式後流就是全緩衝的,但是如果流與乙個終端裝置相關,那麼某些系統也可將其設定為行緩衝的。

(2) setvbuf

1)函式原型

int setvbuf(

file* stream,

char* buffer,

int mode,

size_t size

);

2)引數

buffer:如果是全緩衝或者行緩衝則需要指定緩衝區buffer,如果沒有指定則標準庫會自動為該流分配適當的長度的緩衝區(buffsiz);如果是不帶緩衝則忽略buffer

mode:可為_iofbf 全緩衝;_iolbf 行緩衝;_ionbf 不帶緩衝

size:如果是全緩衝或者行緩衝則2 <= size <= int_max (2147483647);如果不帶緩衝則忽略size

3)返回值

成功是返回0;若出錯返回非0.

4)示例

#include int main( void )

}

執行結果:

[ 2 ] 沖洗緩衝區

在標準i/o庫中,沖洗意味著將緩衝區的內容寫到磁碟上(緩衝區可能只是部分填滿的)。在終端驅動程式方面沖洗表示丟棄已儲存在緩衝區中的資料。

(1)fflush

int fflush( 

file* stream

);

若成功返回0,若出錯返回eof。

< 3 > 利用標準i/o庫進行文字檔案的讀寫

之前的博文對利用i/o庫進行文字檔案的開啟,逐個字元讀寫以及逐行讀寫進行了詳細分析。

利用標準i/o庫對文字檔案進行讀寫

<4>c語言中的二進位制i/o

2、unix環境下,利用unix系統介面進行檔案i/o操作

3、windows環境下利用fopen_s,fscanf_s等庫函式的安全版本進行檔案操作

windows中的fopen_s等安全增強函式

C語言中的檔案操作

include file fopen const char path,const char mode path表示檔案路徑,mode表示檔案使用方式 int fclose file pf 成功關閉返回0,否則返回eof,並且將錯誤記錄在系統全域性變數errno中 從stream當前位置讀取乙個字元 ...

C語言中的檔案操作

本次詳細介紹c下檔案的各種api.1 開啟檔案 file fopen const char filename,const char mode 返回檔案控制代碼,非null為正確開啟。2 關閉檔案 int fclose file stream 例子 file psrc fopen data5610.t...

C語言中的檔案操作

c語言中的檔案操作函式,將資料寫入檔案。具體如下 一 開啟檔案。使用fopen函式。格式為 file fopen const char name,const char mode 其中name為要寫入的檔名,mode為格式字元。要寫入檔案,mode可以是 1 w 只寫方式,文字形式輸入 2 wb 只寫...