Linux庫函數之文件操作fopen/fread/fwrite/fclose/fgets/ftell/fseek...

        Linux應用層軟件的開發,總會涉及到文件(如:日誌,配置)的操作,開發那段時間相關庫函數用的比較多,當然

就能隨手寫出來,但是考慮到人的記憶是有時間限制的,加上現如今海量信息涌入大腦,有段時間不使用就會忘記,這次

趁着手頭開發涉及到比較多這方面的知識,決定花點時間寫給將來自己看,以後有疑問直接查看記錄就OK啦,不用每次都

找度娘,廢話不多說,切入正題。

主要介紹文件操作常用的庫函數:

1)fopen函數

頭文件:#include <stdio.h>

函數原型:FILE *fopen(const char *path, const char *mode);

參數:

path:可能的值:常量字符串(如:“/home/dir/test.txt”),字符串指針(如:char *p_file = "/home/dir/test.txt";),

當然數組也行(如:char file[100] = {"/home/dir/test.txt"};)

mode:可選參數有“r”   "w"   "a"   "r+"   "w+"   "a+"  “其他選項+b”

"r":Open text file for reading.  The stream is positioned at the beginning of the file.  

該文件必須存在,否則失敗;像獲取日誌內容,就用可以只讀方式打開文件,從文件開始讀取數據;

"w":Truncate file to zero length or create text file for writing.  The stream is positioned at the beginning of the file.

文件存在清空,文件不存在則創建;這個就要注意若是要向日志中不斷添加新的內容就不能改模式打開啦;

"a":Open  for  appending (writing at end of file).  The file is created if it does not exist.

The stream is positioned at the end of the file.

文件不存在則創建,文件存在則打開不清空,指向文件尾部,不斷向日志寫內容一般用該方式,不覆蓋原內容;

“b”:則是以文件存儲時的二進制方式打開文件,若是不添加"b"則是以文本方式(ASCII碼)方式打開,這個主要

看實際情況來定,文件一般分爲文本文件和二進制文件,文本文件在磁盤存放時每個字符對應一個字節,而二進制

文件則是按照二進制編碼規則來存儲,簡單例子:文本文件的5678對應存儲爲 00110101 00110110 00110111 00111000

二進制存儲爲:00010110 00101110,一般實際應用中我們編輯的都是文本文件,二進制文件也有例如打開一張圖片等。

根據man手冊的描述總結:

a)若是需要對一個已經存在並且有內容的文件操作,僅僅讀取文件內容推薦"r"模式或者“r+”可以有寫的權限;

b)若是需要創建一個新的文件,一般“w”模式或者"w+"有讀的權限,可以讀取寫入的內容;

c)若是在一個已經存在的文件基礎上,繼續在文件尾部添加內容,則可以"a"模式或者“a+”有讀的權限;

d)若是操作二進制文件則是需要在模式中添加"b"。

返回值:成功打開文件返回FILE指針(文件流),失敗返回NULL;一般會判斷該返回值再執行後續任務;


2)fclose函數

頭文件:#include <stdio.h>

    函數原型:int fclose(FILE *fp);

參數:

fp:成功打開文件返回的FILE指針

功能主要是關閉該文件流,釋放指針;

返回值:成功返回0,失敗EOF   (-1);一般很少做判斷;


3)fread函數

頭文件:#include <stdio.h>

函數原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

參數:

ptr:用來存儲文件內容開闢的內存空間指針或說地址,可以是數組名或者指向malloc分配的內存的指針;

size:讀取的塊個數,跟nmemb配合使用;size爲1,表示讀取一個大小爲nmemb的文件內容到ptr指向內存中;

nmemb:一次讀取的文件內容大小,一般是ptr指向的內存大小,當然前提是size爲1;

stream:就是fopen打開文件返回值;

返回值:成功返回讀取內容的大小,在size爲1時一般小於等於nmemb值,失敗或者文件末尾返回0。

4)fwrite函數

頭文件:#include <stdio.h>

函數原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

參數:

ptr:待寫內容的地址;

size:寫入的塊個數,跟nmemb配合使用;size爲1,表示寫入一個大小爲nmemb的內容到文件中;

nmemb:一次寫入文件的內容大小,一般是ptr指向的內存大小,當然前提是size爲1;

stream:就是fopen打開文件返回值;

返回值:成功返回寫入內容的大小,失敗或者文件末尾返回0。

5)fgets函數

頭文件:#include <stdio.h>

函數原型:char *fgets(char *s, int size, FILE *stream);

參數:

s:用於存儲文件內容的地址;

size:從文件中獲取內容的大小,可以自行根據實際情況定義,若是按行讀取一般定義爲1024字節;

stream:就是fopen打開文件返回值;

功能:這個函數用處很大,尤其是在讀取配置文件時的應用,一般用來按行讀取文件內容,然後分析

每行的內容,這裏面就會涉及到字符串的匹配或者提取字段等等,那麼讀取時會有些什麼需要注意的呢?

情況一:當讀取的內容小於size值時,機會把所有的字符全部讀入到s中包括‘\r\n’,最後自動加上‘\0’構成

一個完整的字符串,這個時候就會需要添加代碼過濾掉'\r\n',將其修改爲‘\0’;

情況二:當讀取的內容大於size,那麼就會自動截斷,最後一位爲'\0'構成一個完整字符串;

該函數的使用主要注意這兩點,也可以從鍵盤讀取輸入stdin。

返回值:成功返回s,失敗返回NULL。


6)ftell函數

頭文件:#include <stdio.h>

函數原型:long ftell(FILE *stream);

該函數主要用來獲取當前文件光標(指針)所處的位置離文件首部之間的字節大小;用的不是太多,但是

配合fseek或者以‘a’方式打開文件,可以獲取文件大小;

返回值:成功返回大小,失敗返回0。

7)fseek函數

頭文件:#include <stdio.h>

函數原型:int fseek(FILE *stream, long offset, int whence);

參數:

offset:偏移量,nL,n>0表示whence指定位置正向偏移,白話說就是從whence往文件尾方向,n<0則是

表示whence指定位置反向偏移,白話說就是從whence往文件頭方向,n = 0就是whence當前位置;

whence:有三個選項:SEEK_SET(文件首部)/SEET_CUR(當前位置)/SEEK_END(文件末尾)

這個函數用的也比較少,可以配合ftell獲取某段內容的大小,一般會涉及到關鍵字定位等;


目前就總結這麼多,至於具體每個的實現,那就是寫代碼調試的事情了,這裏就不在貼代碼,一個是網上有許多

二是沒太多時間,主要還是方法對頭,其他的都好說,只是時間問題,問題方法想清楚了在動手,事半功倍。

努力提升中..........

發佈了30 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章