一:C語言中文件的概念
? ? ? ? 對于文件想必大家都很熟悉,無論在windows上還是Linux中,我們用文件去存儲資料,記錄筆記,常見的如txt文件,word文檔,log文件等。那么,在C語言中文件是什么樣的存在呢,我們又怎么去操作文件,操作文件中又需要注意什么。
????????在操作系統中,為了統一對各種硬件的操作,簡化接口,不同的硬件設備也都被看成一個文件。對這些文件的操作,等同于對磁盤上普通文件的操作。例如:
- 通常把顯示器稱為標準輸出文件,printf 就是向這個文件輸出數據;
- 通常把鍵盤稱為標準輸入文件,scanf 就是從這個文件讀取數據。
?
? ? ? ? 在C語言中對文件的操作也是有規定的。如果不按規定來文件操作很容易出Bug,而且還不好查。
操作文件的正確流程為:
打開文件 --> 讀寫文件 --> 關閉文件
????????文件在進行讀寫操作之前要先打開,使用完畢要關閉。?
????????所謂打開文件,就是獲取文件的有關信息,例如文件名、文件狀態、當前讀寫位置等,這些信息會被保存到一個 FILE 類型的結構體變量中。關閉文件就是斷開與文件之間的聯系,釋放結構體變量,同時禁止再對該文件進行操作。??
????????在C語言中,文件有多種讀寫方式,可以一個字符一個字符地讀取,也可以讀取一整行,還可以讀取若干個字節。文件的讀寫位置也非常靈活,可以從文件開頭讀取,也可以從中間位置讀取。
二:文件打開和關閉
????????在C語言中,操作文件之前必須先打開文件;所謂“打開文件”,就是讓程序和文件建立連接的過程。打開文件之后,程序可以得到文件的相關信息,例如大小、類型、權限、創建者、更新時間等。在后續讀寫文件的過程中,程序還可以記錄當前讀寫到了哪個位置,下次可以在此基礎上繼續操作。
1,文件打開
使用 <stdio.h> 頭文件中的 fopen() 函數即可打開文件,它的用法為:
FILE *fopen(char *filename, char *mode);
入參:filename
為文件名(包括文件路徑),mode
為打開方式,它們都是字符串。
返回值:是一個 FILE 類型的指針,我們可以通過判斷 fopen() 的返回值是否和 NULL 相等來判斷是否打開失敗:如果 fopen() 的返回值為 NULL,那么 fp 的值也為? NULL,此時 if 的判斷條件成立,表示文件打開失敗
????????fopen() 會獲取文件信息,包括文件名、文件狀態、當前讀寫位置等,并將這些信息保存到一個 FILE 類型的結構體變量中,然后將該變量的地址返回。FILE 結構體定義在?<stdio.h> 頭文件中
? ? ? ? 在上面我們提到fopen的第二個入參是mode,表示文件的打開方式,下面我們列出所有的mode組合。
????????在調用 fopen() 函數時,這些信息都必須提供,稱為“文件打開方式”。最基本的文件打開方式有以下幾種:
控制讀寫權限的字符串(必須指明) | |
---|---|
打開方式 | 說明 |
"r" | 以“只讀”方式打開文件。只允許讀取,不允許寫入。文件必須存在,否則打開失敗。 |
"w" | 以“寫入”方式打開文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么清空文件內容(相當于刪除原文件,再創建一個新文件)。 |
"a" | 以“追加”方式打開文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么將寫入的數據追加到文件的末尾(文件原有的內容保留)。 |
"r+" | 以“讀寫”方式打開文件。既可以讀取也可以寫入,也就是隨意更新文件。文件必須存在,否則打開失敗。 |
"w+" | 以“寫入/更新”方式打開文件,相當于w 和r+ 疊加的效果。既可以讀取也可以寫入,也就是隨意更新文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么清空文件內容(相當于刪除原文件,再創建一個新文件)。 |
"a+" | 以“追加/更新”方式打開文件,相當于a和r+疊加的效果。既可以讀取也可以寫入,也就是隨意更新文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么將寫入的數據追加到文件的末尾(文件原有的內容保留)。 |
控制讀寫方式的字符串(可以不寫) | |
打開方式 | 說明 |
"t" | 文本文件。如果不寫,默認為"t" 。 |
"b" | 二進制文件。 |
????????調用 fopen() 函數時必須指明讀寫權限,但是可以不指明讀寫方式(此時默認為"t"
)。?
讀寫權限和讀寫方式可以組合使用,但是必須將讀寫方式放在讀寫權限的中間或者尾部(換句話說,不能將讀寫方式放在讀寫權限的開頭)。例如:
- 將讀寫方式放在讀寫權限的末尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t"
- 將讀寫方式放在讀寫權限的中間:"rb+"、"wt+"、"ab+"
整體來說,文件打開方式由 r、w、a、t、b、+ 六個字符拼成,各字符的含義是:
- r(read):讀
- w(write):寫
- a(append):追加
- t(text):文本文件
- b(binary):二進制文件
- +:讀和寫
?2,文件關閉
文件一旦使用完畢,應該用 fclose() 函數把文件關閉,以釋放相關資源,避免數據丟失。fclose() 的用法為:
int fclose(FILE *fp);
fp 為文件指針。文件正常關閉時,fclose() 的返回值為0,如果返回非零值則表示有錯誤發生。
下面我們通過具體的代碼來展示如何正確的打開和關閉文件(Linux上操作)
#include <stdio.h>int main()
{FILE *fp = fopen("input.txt","r");if(fp == NULL){printf("open file input.txt fail!\n");return 0;}printf("open file input.txt success!\n");fclose(fp);return 0;
}