在Linux標準IO中,就是用庫函數對文件進行操作。在C語言中有許多庫函數方便用戶去對文件進行操作。下麵談談一些簡單基本的函數,這些函數都是被包含在頭文件stdio.h中的。 一、fopen()函數 要操作一個文件,我們肯定先打開它,這裡打開並不是去右鍵文件然後左鍵打開。這裡的打開是指讓系統知道程式 ...
在Linux標準IO中,就是用庫函數對文件進行操作。在C語言中有許多庫函數方便用戶去對文件進行操作。下麵談談一些簡單基本的函數,這些函數都是被包含在頭文件stdio.h中的。
一、fopen()函數
要操作一個文件,我們肯定先打開它,這裡打開並不是去右鍵文件然後左鍵打開。這裡的打開是指讓系統知道程式員要操作哪個文件,如果聽起來比較抽象可以看看函數原型便於理解。
1、函數原型
FILE *fopen( const char *fname, const char *mode );
fopen()函數打開由fname(文件名)指定的文件, 並返回一個關聯該文件的流。如果發生錯誤, fopen()返回NULL。mode(方式)是用於決定文件的用途。(例如 用於輸入,輸出,等等)
這裡的文件名是可以包含路徑的文件名,例如"../test.txt"。
FILE這個玩意兒把他當成一個數據類型即可,它是由標準庫定義的一個東西,就像我們自己定義結構體時,把結構體名稱當做一個數據類型。
fopen()函數的返回值可以理解為一個代號,方便利用別的函數對這個文件操作。Mode(方式) | 意義 |
"r" | 打開一個用於讀取的文本文件 |
"w" | 創建一個用於寫入的文本文件 |
"a" | 附加到一個文本文件 |
"rb" | 打開一個用於讀取的二進位文件 |
"wb" | 創建一個用於寫入的二進位文件 |
"ab" | 附加到一個二進位文件 |
"r+" | 打開一個用於讀/寫的文本文件 |
"w+" | 創建一個用於讀/寫的文本文件 |
"a+" | 打開一個用於讀/寫的文本文件 |
"rb+" | 打開一個用於讀/寫的二進位文件 |
"wb+" | 創建一個用於讀/寫的二進位文件 |
"ab+" | 打開一個用於讀/寫的二進位文件 |
附加的意思是在文件末尾接著進行讀/寫操作,"w"沒有附加說明它是擦除原文件內容,重新寫入。
舉個慄子:
FILE* fp = fopen("demo.txt","w"); //意味著以擦除原來的內容重新寫入的方式打開一個demo.txt文件
這兒的fp就相當於那個代號。
二、fclose()函數
提到了打開,就得想到關閉。fclose()函數就是要完成這件事的函數,下麵是函數原型:
int fclose( FILE *stream );
函數fclose()關閉給出的文件流, 釋放已關聯到流的所有緩衝區。fclose()執行成功時返回0,否則返回EOF。(這裡的EOF已經在標準庫中定義,是一個常數)
這個函數的形參名字是流,正好對應fopen()函數的返回值(關聯該文件的流),也就是“代號”,我們上一步已經把其返回值保存到fp中。所以要關閉一個文件,代碼也就很好寫了。
fclose(fp);
三、fgetc()函數
當學會了打開和關閉,接下來就該去讀讀寫寫了。我們先從讀開始,先讀讀字元,下麵是它的函數原型。
int fgetc( FILE *stream );
fgetc()函數返回來自stream(流)中的下一個字元,如果到達文件尾或者發生錯誤時返回EOF。
當讀取完一個字元的時候,讀取的位置會自動跳到下一個字元後面。(可以利用這個特點去迴圈遍歷一整個文件)
函數很簡單,例子也好寫:
char ch = 0; ch = fgetc(fp); printf("%c",ch);
四、小試牛刀
經過以上的瞭解,可以寫出一個利用fgetc()函數去遍歷整個文件了。
舉個慄子,這裡有一個文件demo2.txt其內容如圖所示。
如何去實現遍歷這個文本文件呢?
①首先肯定是得利用fopen()去讀這個文件,要想操作一個文件就得fopen()。
②利用迴圈語句和fgetc()讀取文件字元,邊讀取變列印。
③讀完後利用close()函數關閉文件。
具體代碼如下:
#include "stdio.h" int main() { FILE* fp = fopen("demo2.txt","r");int ch = 0; ch = fgetc(fp); while(ch != EOF) { printf("%c",ch); ch = fgetc(fp); } printf("\n"); fclose(fp); return 0; }
註:為什麼ch不用char類型,因為博主CPU是ARM架構,處理char類型有點小出入。這裡尤其感謝我的老師的指導,對嵌入式又有了新的認知。
結果如圖:
發現與原文本一模一樣,這個小試牛刀就算結束了。
以上只是本人的理解和所見,如有不同見解和看法,歡迎在評論區批評指正。