天天看點

檔案操作函數(fread,fwrite,fseek,fopen,fclose)

1.fread 和 fwrite:

    fwrite和fread是以記錄為機關的I/O函數,fread和fwrite函數一般用于二進制檔案的輸入輸出。

聲明:

#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

參數解釋:

<code>size</code>指出一條記錄的長度,<code>nmemb</code>指出要讀或寫多少條記錄,這些記錄在<code>ptr</code>所指的記憶體空間中連續存放,共占<code>size * nmemb</code>個位元組,<code>fread</code>從檔案<code>stream</code>中讀出<code>size * nmemb</code>個位元組儲存到<code>ptr</code>中,而<code>fwrite</code>把<code>ptr</code>中的<code>size * nmemb</code>個位元組寫到檔案<code>stream</code>中。

傳回值:

    讀或寫的記錄數,成功時傳回的記錄數等于nmemb,出錯或讀到檔案末尾時傳回的記錄數小于nmemb,也可能傳回0。

功能:     fread()──從fp所指向檔案的目前位置開始,一次讀入size個位元組,重複count次,并将讀入的資料存放到從buffer開始的記憶體中;    buffer是存放讀入資料的起始位址(即存放何處)。     fwrite()──從buffer開始,一次輸出size個位元組,重複count次, 并将輸出的資料存放到fp所指向的檔案中。buffer是要輸出資料在    記憶體中的起始位址(即從何處開始輸出)。

<code>     fread</code>和<code>fwrite</code>用于讀寫記錄,這裡的記錄是指一串固定長度的位元組,比如一個<code>int</code>、一個結構體或者一個定長數組。<code>   </code>

<code>      nmemb</code>是請求讀或寫的記錄數,<code>fread</code>和<code>fwrite</code>傳回的記錄數有可能小于<code>nmemb</code>指定的記錄數。例如目前讀寫位置距檔案末尾隻有一條記錄的長度,調用<code>fread</code>時指定<code>nmemb</code>為2,則傳回值為1。如果目前讀寫位置已經在檔案末尾了,或者讀檔案時出錯了,則<code>fread</code>傳回0。如果寫檔案時出錯了,則<code>fwrite</code>的傳回值小于<code>nmemb</code>指定的值。下面的例子由兩個程式組成,一個程式把結構體儲存到檔案中,另一個程式和從檔案中讀出結構體。

2.fseek用法 int fseek(FILE *stream, long offset, int fromwhere);

參數: 第一個參數file指針 第二個參數移動的偏移量 第三個參數移動到哪裡 分别用3個宏

SEEK_SET 既0 檔案開頭 SEEK_CUR 既1 檔案目前位置 SEEK_END 既2 檔案結尾 不推薦用數字 最好用宏

簡言之: fseek(fp,100L,SEEK_SET);把fp指針移動到離檔案開頭100位元組處; fseek(fp,100L,SEEK_CUR);把fp指針移動到離檔案目前位置100位元組處; fseek(fp,100L,SEEK_END);把fp指針退回到離檔案結尾100位元組處。 此函數跟ftell函數結合常用來計算流的長度: fseek(fp, 0, SEEK_END);   long filelength = ftell(fp);

3.fopen、fclose

fopen:功能打開檔案

fclose:功能關閉檔案

頭檔案:#include&lt;stdio.h&gt;

定義函數:FILE * fopen(const char * path,const char * mode);

函數參數說明:

path:字元串包含欲打開的檔案路徑及檔案名。 mode:字元串則代表着流形态,取值如下:      "r " 打開隻讀檔案,該檔案必須存在。      "r+ "打開可讀寫的檔案,該檔案必須存在。      "w "打開隻寫檔案,若檔案存在則檔案長度清為0,即該檔案内容會消失。若檔案不存在則建立該檔案。      "w+ "打開可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案内容會消失。若檔案不存在則建立該檔案。      "a "以附加的方式打開隻寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的内容會被保留。      "a+" 以附加方式打開可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的内容會被保留。

     上述的形态字元串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函數庫打開的檔案為二進制檔案,而非純文字檔案。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)權限,此檔案權限也會參考umask 值。

傳回值:

     檔案順利打開後,指向該流的檔案指針就會被傳回。若果檔案打開失敗則傳回NULL,并把錯誤代碼存在errno 中。 附加說明

     一般而言,打開檔案後會作一些檔案讀取或寫入的動作,若開檔案失敗,接下來的讀寫動作也無法順利進行,是以在fopen()後請作錯誤判斷及處理。

上一篇: C file函數
下一篇: 監聽器watch

繼續閱讀