1. 程式人生 > >linux fopen fread fwrite函式分析

linux fopen fread fwrite函式分析

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中
 
2、fread
size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
引數size,表示一次讀取的資料單元大小,nmemb表示讀取的次數。

    成功時fread返回的值與nmemb相等;若小於nmemb但是大於0,則可能是到了檔案末尾,不夠次數;若返回0,則是檔案讀取錯誤,不滿一個size的大小。
    所以迴圈讀取檔案的時候,while(可以判斷是否大於等於0)作為條件,裡面再基於feof函式判斷是否到了檔案末尾而退出迴圈。

3、fwrite
size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
引數size,表示一次寫入的資料單元大小,nmemb表示寫入的次數。

    成功時fwrite返回的值與nmemb相等;若小於nmemb表示出錯了,可以使用perror函式檢視錯誤原因。