C++檔案操作——fopen/fseek/ftell/fread/fwrite/fclose等函式用法
1. fopen
FILE * fopen(const char * path,const char * mode);
函式說明
引數path字串包含欲開啟的檔案路徑及檔名,引數mode字串則代表著流形態。
mode有下列幾種形態字串:
r 開啟只讀檔案,該檔案必須存在。
r+ 開啟可讀寫的檔案,該檔案必須存在。
rb+ 讀寫開啟一個二進位制檔案,只允許讀寫資料。
rt+ 讀寫開啟一個文字檔案,允許讀和寫。
w 開啟只寫檔案,若檔案存在則檔案長度清為0,即該檔案內容會消失。若檔案不存在則建立該檔案。
w+ 開啟可讀寫檔案,若檔案存在則檔案長度清為零,即該檔案內容會消失。若檔案不存在則建立該檔案。
a 以附加的方式開啟只寫檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾,即檔案原先的內容會被保留。(EOF符保留)
a+ 以附加方式開啟可讀寫的檔案。若檔案不存在,則會建立該檔案,如果檔案存在,寫入的資料會被加到檔案尾後,即檔案原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫開啟或新建一個二進位制檔案;只允許寫資料。
wb+ 讀寫開啟或建立一個二進位制檔案,允許讀和寫。
wt+ 讀寫開啟或著建立一個文字檔案;允許讀寫。
at+ 讀寫開啟一個文字檔案,允許讀或在文字末追加資料。
ab+ 讀寫開啟一個二進位制檔案,允許讀或在檔案末追加資料。
上述的形態字串都可以再加一個b字元,如rb、w+b或ab+等組合,加入b 字元用來告訴函式庫開啟的檔案為二進位制檔案,而非純文字檔案。不過在POSIX系統,包含Linux都會忽略該字元。由fopen()所建立的新檔案會具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)許可權,此檔案許可權也會參考umask 值。
有些C編譯系統可能不完全提供所有這些功能,有的C版本不用"r+","w+","a+",而用"rw","wr","ar"等,讀者注意所用系統的規定。
返回值
檔案順利開啟後,指向該流的檔案指標就會被返回。若果檔案開啟失敗則返回NULL,並把錯誤程式碼存在errno 中。
附加說明
一般而言,開啟檔案後會作一些檔案讀取或寫入的動作,若開啟檔案失敗,接下來的讀寫動作也無法順利進行,所以在fopen()後請作錯誤判斷及處理。
2. fseek
功 能 重定位流(資料流/檔案)上的檔案內部位置指標
注意:不是定位檔案指標,檔案指標指向檔案/流。位置指標指向檔案內部的位元組位置,隨著檔案的讀取會移動,檔案指標如果不重新賦值將不會改變指向別的檔案。
用 法
int fseek(FILE *stream, long offset, int fromwhere); fromwhere——//SEEK_SET開頭-0,SEEK_CUR當前位置-1,SEEK_END結束-2
描 述
函式設定檔案指標stream的位置。如果執行成功,stream將指向以fromwhere(偏移起始位置:檔案頭0,當前位置1,檔案尾2)為基準,偏移offset(指標偏移量)個位元組的位置。如果執行失敗(比如offset超過檔案自身大小),則不改變stream指向的位置。
返回值
成功,返回0,否則返回其他值。
fseek position the file(檔案) position(位置) pointer(指標) for the file referenced by stream to the byte location calculated by offset.
3.ftell
函式名: ftell
功 能: 返回當前檔案指標
函式原型: long ftell(FILE *stream);
函式功能:函式 ftell() 用於得到檔案位置指標當前位置相對於檔案首的偏移位元組數。在隨機方式存取檔案時,由於檔案位置頻繁的前後移動,程式不容易確定檔案的當前位置。呼叫函式ftell()就能非常容易地確定檔案的當前位置。
呼叫示例:ftell(fp);利用函式 ftell() 也能方便地知道一個檔案的長。如以下語句序列: fseek(fp, 0L,SEEK_END); len =ftell(fp); 首先將檔案的當前位置移到檔案的末尾,然後呼叫函式ftell()獲得當前位置相對於檔案首的位移,該位移值等於檔案所含位元組數。
4.fread
功 能: 從一個流中讀資料
函式原型: int fread(void *ptr, int size, int nitems, FILE *stream);
參 數:用於接收資料的地址(指標)(ptr)
單個元素的大小(size) :單位是位元組而不是位,例如讀取一個整數值就是4
元素個數(nitems)
提供資料的檔案指標(stream)
返回值:成功讀取的元素個數
5. fwrite
向檔案讀入寫入一個數據塊
用 法
fwrite(const void*buffer,size_t size,size_t count,FILE*stream);
(1)buffer:是一個指標,對fwrite來說,是要輸出資料的地址。
(2)size:要寫入的位元組數;
(3)count:要進行寫入size位元組的資料項的個數;
(4)stream:目標檔案指標。
說明:寫入到檔案的哪裡? 這個與檔案的開啟模式有關,如果是r+,則是從file pointer指向的地址開始寫,替換掉之後的內容,檔案的長度可以不變;如果是a+,則從檔案的末尾開始新增,檔案長度加大,而且是fseek函式對此函式沒有作用。
2).
fwrite(file,string,length)
引數 | 描述 |
file | 必需。規定要寫入的開啟檔案。 |
string | 必需。規定要寫入檔案的字串。 |
length | 可選。規定要寫入的最大位元組數。 |
fwrite() 返回寫入的字元數,出現錯誤時則返回 false。
6.fclose
關閉一個流
用法:int fclose(FILE *stream);