C語言標準I O檔案操作

2022-09-04 01:36:08 字數 3359 閱讀 6301

模式字串

意義「r」

開啟乙個文字檔案,可以讀取檔案

「w」開啟乙個文字檔案,可以寫入檔案,先將檔案的長度截為0,如果檔案不存在則建立之

「a」開啟乙個文字檔案可以寫入檔案,向已有檔案的尾部追加內容,如果該檔案不存在則建立之

「r+」

開啟乙個文字檔案,可以進行更新,也即可以讀取和寫入檔案

「w+」

開啟乙個文字檔案,可以進行更新(讀取和寫入),如果該檔案存在則首先長度截為0,若不存在則建立之

「a+」

開啟乙個文字檔案,可以進行更新(讀取和寫入),向已有檔案的尾部追加內容,如果檔案不存在則建立之,可以讀取整個檔案,但寫入時只能追加內容

「rb」,」wb」,」ab」

「ab+」,」a+b」,」wb+」

「w+b」,」ab+」,」a+b」

與前面的模式相似,只是使用二進位制模式而非文字模式開啟檔案

eg :file *fp;

char *filepath;

fp = fopen(filepath,」r」);

注意:如果使用任何一種w模式開啟乙個已有的檔案,檔案的內容將被刪除,以便程式乙個空檔案開始操作。

程式成功開啟乙個檔案後,fopen函式返回乙個檔案指標,其他io函式用這個指標來指定該檔案。檔案指標(fp)是一種指向file的指標。file定義在stdio.h中,指標fp並不指向實際的檔案,而是指向乙個關於檔案的資訊的資料報。

typedef struct _iobuf

char*   _ptr;//檔案輸入的下乙個位置

int _cnt;//當前緩衝區的相對位置

char*   _base;//基址,即檔案的起始位置

int _flag;//檔案標誌

int _file;//檔案的有效性驗證

int _charbuf;//檢查緩衝區的狀況,如果無緩衝區則不讀取

int _bufsiz;//檔案的大小

char*   _tmpfname;//臨時檔名

} file;

如果不能開啟檔案,fopen返回的是乙個空指標

ch = getc(fp)//從fp指標指定的檔案中獲得乙個字元

putc(ch,fpout)//把ch寫入file指標fpout指定的檔案中。

如果在嘗試讀入字元時發現已經到達檔案結尾,getc函式會返回乙個特殊值eof,所以c語言只有在讀取超出檔案結尾以後才會發現檔案的結尾,為了避免試圖讀取空檔案帶來的問題,應該對檔案的輸入使用入口條件迴圈(而非do while迴圈)。鑑於getc函式的設計,程式應該在進入迴圈體之前嘗試進行第一次讀取。所以下面是乙個比較好的模式:

char  ch;

while((ch = getc(fp)) != eof)

fclose(fp)函式關閉由指標fp指定的檔案,同時根據需要重新整理緩衝區。更正規的程式也行還要檢查是否成功關閉了檔案,如果成功關閉,返回0,否則返回eof。(磁碟已滿,磁碟被移走或者出現io錯誤等都會導致fclose執行失敗)。

fscanf 和fprintf函式與scanf和printf的工作方式類似。

file *fp;

fp = fopen(filename,』a+』);

fprintf(fp,」%s」,word);//向fp指向的檔案寫入word指向的字串

fscanf(fp,」%s」,word);//從fp指向的檔案讀取字串到word中

rewind(fp)//回到檔案的開始處。

fseek的3個引數中,第乙個引數是指向被搜尋檔案的file指標,應該已經使用fopen開啟了該檔案

第二個引數稱為偏移量,表示從起點開始要移動的距離,這個引數必須是乙個long型別的值,可以為正(前移)負(後移),一可以為零。

第三個引數是模式,用來標識起點。在ansi下,stdio.h標頭檔案指定了下列模式常量:

seek_set:檔案的開始

seek_cur:當前位置

seek_end:檔案的結尾

eg:fseek(fp,0l,seek_set)//找到檔案的開始處,等價與rewind(fp)

fseek(fp,10l,seek_set)//找到檔案的第10個位元組

fseek(fp,2l,seek_cur)//從當前位置向前移動2個位元組

fseek(fp,-10l,seek_end)//從檔案結尾處退回10個位元組

如果一切正常,fseek返回值為0,如果有錯誤出現,例如試圖移動超出檔案範圍,fseek返回值為-1.

ftell為long型別,它返回當前檔案的位置。ftell函式通過返回距離檔案開始處位元組數目來確定檔案的位置。檔案的第乙個位元組到檔案開始處的距離是位元組0,依次類推。在ansi c下,這種定義適用於以二進位制模式開啟的檔案,但是對於以文字模式開啟的檔案來講,不一定是這樣。

fwrite的原型是:

size_t  fwrite(const  void *restrict  ptr,  size_t  size, size_t  nmemb,  file * restrict fp);

fwrite()函式將二進位制資料寫入檔案,指標ptr是要寫入的資料塊的位址,size表示要寫入的資料塊的大小,以位元組為單位,nmemb表示資料塊的數目,fp指定要寫入的檔案。例如要儲存乙個256位元組大小的資料物件(比如陣列)可以這樣寫:

char buffer[256];

fwrite(buffer,256,1,fp);

這一呼叫將一塊256位元組的資料塊從緩衝區寫入了檔案。又比如要儲存乙個包含10個double值的陣列可以這樣做:

double  earnings[10];

fwrite(earnings,sizeoof(double),10,fp);

fwirte會返回成功寫入的專案數,正常情況下他與nmemb相等,如果有寫入錯誤的話,返回值就會小於nmemb。

fread()的原型為

size_t fread(void  *restrict  ptr, size_t  size,  size_t nmemb,  file *restrict fp);

fread()與fwrite()函式的引數相同,ptr為讀入檔案資料的記憶體儲存位址,fp指定要讀取的檔案,使用這一函式來讀取通過fwrite函式寫入的資料,例如要恢復前一例子中儲存的10個double值的陣列可以如下呼叫:

double earnings[10];

fread(earnings,sizeof(double),10,fp);

fread會返回成功讀取的專案數,正常情況下他與nmemb相等,如果有讀取錯誤的話,返回值就會小於nmemb。

當標準輸入函式返回eof時通常表示已經達到了檔案結尾,可是這也有可能表示發生了讀取錯誤,使用feof()和ferror()可以區分這兩種情況,如果最近一次輸入輸出呼叫檢測到檔案的結尾,feof返回乙個非零值,否則返回零。如果發生讀寫錯誤,ferror返回乙個非零值,否則返回乙個零。

C語言檔案IO操作(標準IO)

函式 file fopen const char path,const char mode 引數1 將要開啟的檔案路徑 引數2 開啟檔案的方式 1.r 唯讀的方式開啟 2.w 若檔案不存在則建立檔案,若存在此檔案則清空檔案內容並打卡 3.a 若檔案不存在則建立檔案,若存在則在末尾追加 不會清空原檔案...

C語言標準IO檔案的讀寫操作2

3.檔案的讀寫操作 1 以位元組的方式進行讀寫 fputc fgetc 引數 stream 要讀的檔案流返回值 返回讀到的字元,讀到末尾或者發生錯誤返回eof引數 c 要寫入的字元 stream 要寫的檔案流返回值 成功返回寫的字元,失敗返回eof如果要區分讀到末尾還是讀出錯,可以使用以下兩個函式來...

C語言 檔案I O操作

c語言讀寫檔案的步驟一般是 建立或開啟檔案 讀或寫檔案 關閉檔案 當然讀或寫的過程中還可以通過操作當前檔案偏移量來控制讀寫位置。下面分別介紹這些函式 標頭檔案 include 此標頭檔案定義了以下oflag o rdonly 唯讀0 o wronly 只寫1 o rdwr 讀寫2 上面三個oflag...