1. 程式人生 > >C++檔案操作——fopen/fseek/ftell/fread/fwrite/fclose等函式用法

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() 把 string的內容寫入檔案指標 file處。 如果指定了 length,當寫入了 length個位元組或者寫完了 string以後,寫入就會停止,視乎先碰到哪種情況。

  fwrite() 返回寫入的字元數,出現錯誤時則返回 false。

6.fclose

      關閉一個流

用法:
  int fclose(FILE *stream);