C語言學習:文件操作預備知識

我們對文件的概念已經非常熟悉了,比如常見的 Word 文檔、txt 文件、源文件等。文件是數據源的一種,最主要的作用是保存數據。

在操作系統中,為了統一對各種硬件的操作,簡化接口,不同的硬件設備也都被看成一個文件。對這些文件的操作,等同於對磁盤上普通文件的操作。例如,通常把顯示器稱為標準輸出文件,printf 就是向這個文件輸出,把鍵盤稱為標準輸入文件,scanf 就是從這個文件獲取數據。

所謂打開文件,就是獲取文件的有關信息,例如文件名、文件狀態、當前讀寫位置等,這些信息會被保存到一個 FILE 類型的結構體變量中。關閉文件就是斷開與文件之間的聯繫,釋放結構體變量,同時禁止再對該文件進行操作。

在C語言中,文件有多種讀寫方式,可以一個字符一個字符地讀取,也可以讀取一整行,還可以讀取若干個字節。文件的讀寫位置也非常靈活,可以從文件開頭讀取,也可以從中間位置讀取。

在C語言中,文件操作都是由庫函數來完成的。

C語言學習:文件操作預備知識

操作文件的正確流程為:打開文件 --> 讀寫文件 --> 關閉文件。文件在進行讀寫操作之前要先打開,使用完畢要關閉。

我們下面將嚴格按照這個流程講解C語言的文件。

文件的打開(fopen函數)

fopen() 函數用來打開一個文件,它的原型為:FILE *fopen(char *filename, char *mode);

filename為文件名(包括文件路徑),mode為打開方式,它們都是字符串。

fopen() 會獲取文件信息,包括文件名、文件狀態、當前讀寫位置等,並將這些信息保存到一個FILE類型的結構體變量中,然後將該變量的地址返回。

FILE是在stdio.h頭文件中定義的一個結構體,用來保存文件信息。

如果希望接收 fopen() 的返回值,就需要定義一個 FILE 類型的指針。例如:

FILE *fp = fopen("demo.txt", "r");

表示以“只讀”方式打開當前目錄下的 demo.txt 文件,並使 fp 指向該文件,這樣就可以通過 fp 來操作 demo.txt 了。fp 通常被稱為文件指針。

又如:FILE *fp = fopen("D:\\demo.txt","rb");

表示以二進制方式打開 D 盤下的 demo.txt 文件,允許讀和寫。

打開方式(mode)有多種,見下表:打開方式

r以只讀方式打開文件,只允許讀取,不允許寫入。該文件必須存在。

r+以讀/寫方式打開文件,允許讀取和寫入。該文件必須存在。

rb+以讀/寫方式打開一個二進制文件,允許讀/寫數據。

rt+以讀/寫方式打開一個文本文件,允許讀和寫。

w以只寫方式打開文件,若文件存在則長度清為0,即該文件內容消失,若不存在則創建該文件。

w+以讀/寫方式打開文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。

a以追加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。

a+以追加方式打開可讀/寫的文件。若文件不存在,則會建立該文件,如果文件存在,則寫入的數據會被加到文件尾後,即文件原先的內容會被保留。

wb以只寫方式打開或新建一個二進制文件,只允許寫數據。

wb+以讀/寫方式打開或建立一個二進制文件,允許讀和寫。

wt+以讀/寫方式打開或建立一個文本文件,允許讀寫。

at+以讀/寫方式打開一個文本文件,允許讀或在文本末追加數據。

ab+以讀/寫方式打開一個二進制文件,允許讀或在文件末追加數據。

幾點說明

1) 文件打開方式由r、w、a、t、b、+ 六個字符拼成,各字符的含義是:

  • r(read):讀

  • w(write):寫

  • a(append):追加

  • t(text):文本文件,可省略不寫

  • b(banary):二進制文件

  • +:讀和寫

2) 如果沒有“b”字符,文件以文本方式打開。

3) 凡用“r”打開一個文件時,該文件必須已經存在。

4) 在打開一個文件時,如果出錯,fopen將返回一個空指針值NULL。在程序中可以用這一信息來判別是否完成打開文件的工作,並作相應的處理。因此常用以下程序段打開文件:

if( (fp=fopen("D:\\demo.txt","rb") == NULL ){

printf("Error on open D:\\demo.txt file!");

getch();

exit(1);}

這段程序的意義是,如果返回的指針為空,表示不能打開D盤根目錄下的 demo.txt 文件,並給出提示信息“error on open D:\\demo.txt file!”。第3行getch()的功能是從鍵盤輸入一個字符,但不在屏幕上顯示。在這裡,該行的作用是等待,只有當用戶從鍵盤敲任一鍵時,程序才繼續執行,因此用戶可利用這個等待時間閱讀出錯提示。敲鍵後執行exit(1)退出程序。

文件關閉(fclose函數)

文件一旦使用完畢,應該用

fclose();函數把文件關閉,以釋放相關資源,避免數據丟失。fclose() 的原型為:int fclose(FILE *fp);

fp 為文件指針。例如:fclose(fp);

文件正常關閉時,fclose() 的返回值為0,如果返回非零值則表示有錯誤發生。

在學習C語言fopen()函數後,知道它的第二個參數是標誌字符串。如果字符串中出現'b',則表明是以打開二進制(binary)文件,否則是打開文本文件。

文本文件和二進制文件的本質區別

文件可以分為兩類:二進制文件和字符(文本)文件。從物理上講二進制文件和字符文件沒有區別,都是以二進制的形式保存在磁盤上。但是它們在文件的組織形式上不一樣,二進制文件有文件頭(File Header),用以表明文件的大小、類型等信息,程序在處理二進制文件時一般會先分析文件頭,判斷文件是否合法,也就是說,文件頭後面的數據才是程序真正要處理的;字符文件沒有文件頭,第一個字節就是要顯示的內容。

文本文件是基於字符編碼的,常見的編碼方式有 ASCII、UNICODE、UTF-8 等;指定編碼方式後,每個字節(也可以是每兩個、三個字節)所表示的字符是一樣的,任何程序都可以正確讀取。

所以,字符文件是通用的,任何程序只要按照對應的編碼方式打開都可以正確顯示,二進制文件只有特定的程序才能處理。

文本文件和二進制文件都可以在屏幕上顯示,但是二進制文件的內容無法讀懂,大部分是亂碼。

在C語言中,二進制方式很簡單,讀文件時,會原封不動的讀出文件的全部內容,寫的時候,也是把內存緩衝區的內容原封不動的寫到文件中。

把一個文本文件讀入內存時,要將ASCII碼轉換成二進制碼,而把文件以文本方式寫入磁盤時,也要把二進制碼轉換成ASCII碼,因此文本文件的讀寫要花費較多的轉換時間。對二進制文件的讀寫不存在這種轉換。

對於一般不是特別大的系統,執行效率是可以忽略的。因此在選擇什麼文件記錄數據時,沒有必要糾結,你喜歡什麼就用什麼,你記住什麼就用什麼,ok.

小結:

一般學習C語言到文件的時候,我們已經學習了C語言的大部分了,這時候我們可能會寫一些小的系統,

比如學生管理系統,圖書管理系統等。這時候就要用到C語言文件的操作,文件還是三部曲:

fopen(開--fwrite、fread進行讀寫操作--fclose最後關閉。

這是文件的步驟,不會改變的,也就是固定模板,計算你不懂,你還可以死記硬背啊。

今天給大家開個C語言文件操作的頭,上面的概念是需要記住的和了解的,比如打開方式和關閉方式的字母。

我們才能進行下一步的操作。今天講的你可能還是對文件的操作不太明白,但這些是預備知識,你不知道,

後面的你也不明白呀。先記住這些我會讓你們對C語言的文件操作整的明明白白的,好吧!

後面我會繼續講解C語言文件的複雜操作。

對於C語言你們有什麼不明白需要講的,可以私信給我,我對會給你們做出答覆的。


分享到:


相關文章: