C語言關於文件的操作方法總結
什麼是文件
程序文件
其實從文件的功能的角度來說:我們的文件可以分為兩種類型的文件:程序文件和數據文件。
就拿我們C語言的程序為例子,包括瞭程序文件,即後綴為.c的文件;目標文件,即在windows環境下後綴為.obj的文件;可執行程序文件,即後綴為.exe的文件。
數據文件
數據文件,一般指的是用來存儲我們在使用應用程序的時候需要讀寫的數據的文件。
而我們討論的文件的操作也指的是數據文件的操作。
文件名
文件名通常由三部分組成:
文件路徑+文件名主幹+文件後綴
為什麼要使用文件
我們在運行程序的時候,總會產生一些數據,如果我們不對數據進行存儲,那麼等待程序結束的時候,數據就會消失。
舉個例子:我們上次寫過的簡易通訊錄(簡易版通訊錄),如果我們這一次運行瞭這個程序,輸入瞭信息,但是沒有對數據進行保存,關閉程序後,下次再次運行程序,就看不到之前的數據瞭。
而我們想要的是,把通訊錄的信息記錄下來,隻有我們自己選擇刪除數據的時候,數據才不復存在。
而這就涉及到瞭數據持久化的問題,我們一般數據持久化的方法有,把數據存放在磁盤文件、存放到數據
庫等方式。
使用文件我們可以將數據直接存放在電腦的硬盤上,做到瞭數據的持久化。
文件的操作
文件緩沖區
C語言是使用“緩沖文件系統”來處理文本文件和二進制文件。
緩沖文件系統就是指系統自動地在內存中為程序中每一個正在使用的文件開辟一個“文件緩沖區”、
這個文件緩沖區就相當於一個“中間人”,會在程序數據區和硬盤文件中充當一個過渡者的身份。
文件指針(FILE)
緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。
每個被使用的文件都在內存中開辟瞭一個相應的文件信息區,用來存放文件的相關信息(如文件的名
字,文件狀態及文件當前的位置等)。這些信息是保存在一個結構體變量中的。該結構體類型是有系統聲明的,取名FILE.
使用該結構體類型來定義文件指針時,需要包含頭文件<stdio.h>。
需要註意的是,不同的C編譯器的FILE類型包含的內容不完全相同,但是大同小異。
每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,並填充其中的信息,
我們作為使用者不必關心細節。
我們一般都是通過一個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。
FILE* pf;//定義瞭一個文件指針變量
定義pf是一個指向FILE類型數據的指針變量。可以使pf指向某個文件的文件信息區(是一個結構體變量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關聯的文件。
文件的打開和關閉
我們在對文件進行讀寫之前應該先打開文件,在使用結束之後應該關閉文件。
在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當於建立瞭指針和文件的關系。
ANSIC 規定使用fopen函數來打開文件,fclose來關閉文件。
//打開文件 FILE * fopen ( const char * filename, const char * mode ); //關閉文件 int fclose ( FILE * stream );
fopen
該函數包含在<stdio.h>頭文件中,用於打開文件的操作。
形參列表列表中的第一個參數是文件的名稱,第二個參數是文件的打開方式。
如果打開成功,我們就可以用一個文件指針來接收返回值,用於管理這個文件;如果打開失敗,就會返回一個空指針。
因此,我們再接收該函數返回值的時候,應該加上一步檢驗是否為空指針的操作。
fclose
該函數同樣包含在<stdio.h>中
當我們使用完文件的時候,記得要關閉文件。
我們通過fclose函數,並把文件指針作為參數傳入即可。
如果關閉成功,該函數就返回0,如果關閉失敗,就會返回EOF(-1)。
文件的打開方式
文件有不同的打開方式,不同的打開方式對應著不同的操作。
文件的使用方式 | 含義 | 如果指定文件不存在 |
---|---|---|
“r”(隻讀) | 為瞭輸入數據,打開一個已經存在的文本文件 | 出錯 |
“w”(隻寫) | 為瞭輸出數據,打開一個文本文件 | 建立一個新的文件 |
“a”(追加) | 向文本文件尾添加數據 | 建立一個新的文件 |
“rb”(隻讀) | 為瞭輸入數據,打開一個二進制文件 | 出錯 |
“wb”(隻寫) | 為瞭輸出數據,打開一個二進制文件 | 建立一個新的文件 |
“ab”(追加) | 向一個二進制文件尾添加數據 | 出錯 |
“r+”(讀寫) | 為瞭讀和寫,打開一個文本文件 | 出錯 |
“w+”(讀寫) | 為瞭讀和寫,建議一個新的文件 | 建立一個新的文件 |
“a+”(讀寫) | 打開一個文件,在文件尾進行讀寫 | 建立一個新的文件 |
“rb+”(讀寫) | 為瞭讀和寫打開一個二進制文件 | 出錯 |
“wb+”(讀寫) | 為瞭讀和寫,新建一個新的二進制文件 | 建立一個新的文件 |
“ab+”(讀寫) | 打開一個二進制文件,在文件尾進行讀和寫 | 建立一個新的文件 |
演示:
#include <stdio.h> int main() { FILE* pFile; //打開文件 pFile = fopen("myfile.txt", "w"); //文件操作 if (pFile != NULL) { fputs("fopen example", pFile); //關閉文件 fclose(pFile); } return 0; }
我們會看到,如果使用的是w的打開方式來使用文件的話,程序會在該代碼所在源文件的目錄下尋找你想要打開的文件,如果文件不存在的話,就會幫自動幫你創建一個。
但是,如果使用的打開方式是r,如果程序發現所在目錄不存在該文件,就會出錯。
例子如下
int main() { FILE* pFile; //打開文件 pFile = fopen("cmyfile.txt", "r"); //文件操作 if (pFile == NULL) { perror("fopen"); return -1; } fputs("fopen example", pFile); //關閉文件 fclose(pFile); return 0; }
當我該源文件的文件夾中,並不存在這個文件時,就會出錯,並且我通過瞭perror這個函數把錯誤信息打印瞭出來。
需要註意的是,就像上面栗子那樣,隻寫瞭文件名.後綴名,會默認在該源文件所在的文件下進行查找,如果需要指定目錄,則需要在文件名前面加上文件路徑。
例如
#include <stdio.h> int main() { FILE* pFile; //打開文件 pFile = fopen("c:/program/test/myfile.txt", "w"); //文件操作 if (pFile != NULL) { fputs("fopen example", pFile); //關閉文件 fclose(pFile); } return 0; }
註意
在C語言中,如果想要輸入路徑的話,我們一般使用斜杠(/),而不使用反斜杠(\),因為反斜杠是轉義的標志,很有可能你的路徑中,剛好存在可以轉義的內容,這樣就會導致失敗。如果要使用反斜杠,就要兩條反斜杠連在一起用。
以上就是我們在使用一個文件的時候的基本操作,先要打開文件,然後是對文件進行操作,最後是關閉文件。
流的相關概念
流是個高度抽象的概念,我們可以理解為這就相當於時一條通道,就像水流一樣,輸入流可以看作一個輸入通道,輸出流可以看作一個輸出通道。
流,這一條通道,連接的是程序和外部設備。
當外部設備需要把數據輸入到程序的時候,就需要輸入流。
當程序需要把數據輸出到外部設備的時候,就需要輸出流。
按照我個人的理解
標準輸入流,就是連接程序和標準輸入設備(鍵盤)的通道。
標準輸出流,就是鏈接程序和標準輸出設備(屏幕)的通道。
文件的順序讀寫
順序讀寫,顧名思義,就是按照先後順序來進行讀取和寫入的操作。
功能 | 函數名 | 適用於 |
---|---|---|
字符輸入函數 | fgetc | 所有輸入流 |
字符輸出函數 | fputc | 所有輸出流 |
文本行輸入函數 | fgets | 所有輸入流 |
文本行輸出函數 | fputs | 所有輸出流 |
格式化輸入函數 | fscanf | 所有輸入流 |
格式化輸出函數 | fprintf | 所有輸出流 |
二進制輸入 | fread | 文件 |
二進制輸出 | fwrite | 文件 |
fputc
這個函數包含在<stdio.h>中,該函數時一個字符一個字符的輸入的。
第一個參數是我們想要輸入的字符,第二個參數就是輸入流。
我們可以這樣理解
我們通過這個函數,把想要輸入的字符,放到對應的流中,然後這個流,會把這個字符送到對應的設備上。
如果我們寫的是標準輸出流,那麼就會把數據輸出到屏幕上,我們就可以再控制臺看見瞭。
fgets
該函數同樣包含在<stdio.h>中,該函數是從流中獲得一個字符。
還有剩下的函數,就不一一舉例瞭,使用方法都大同小異。
到此這篇關於C語言關於文件的操作方法總結的文章就介紹到這瞭,更多相關C語言 文件操作內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!