注意,請認真學習完《C程序設計(第五版)》第十章後再閱讀本文會有更大的收獲。
C語言文件操作
文件對于普通的電腦使用者來說,文件主要用于存儲和讀取文字、圖片、音視頻等。對于C語言的開發者來講,文件就是存儲和讀取數據的媒介。
C語言中,文件都是按字節寫入的,并在需要的時候按照存儲的字節大小來相應的讀取,用字節流(stream)來形容是最合适不過了。
那C語言究竟如何對文件進行讀寫操作的呢?下面來一起學習一下吧!
ASCII文件和二進制文件ASCII文件裡的所有内容都是ASCII字符,比如數字100,分别以'1'、'0'、'0'的ASCII字符形式存儲,而一個ASCII字符占一個字節,所以100存儲在ASCII文件裡占用3個字節。
上述情況如果存儲在二進制文件中就可以100這個整數的形式存儲,通常占用4個字節。我們來測試一下,下圖中兩個文件都保存了三個數字1、10、100,上面是ASCII文件占用6個字節,下面是二進制文件占用3*4=12個字節。
ASCII文件和二進制文件對比
ASCII完全是按照字符表現形式存儲的,而二進制則是按照内存中數據存儲的形式存儲的;ASCII文件裡面的内容對人來說很友好,直接能讀懂,而二進制文件需要知道存儲的數據到底是什麼才能解析,因為數據在内存中占用的字節數是不固定的。
ASCII可以理解為按照“字符表象”存儲,二進制則是照搬“值在内存中的存儲方式”存儲。
文件與指針C語言中定義了文件在内存中的存儲信息為一個結構體,叫作FILE。我們通常操作文件的時候會定義一個指向這個文件結構體數據類型的指針變量,如FILE *fp;
打開文件
在Visual Studio 2022裡,使用fopen_s()函數替代了原來的fopen()函數來打開文件。
fopen_s()不再返回文件系統的指針,而是作為第一個參數傳入,如:
fopen_s打開文件
關閉文件
關閉一個打開的文件使用fclose()函數。由于C語言緩沖區讀寫文件的特性,尤其是向文件寫入數據時,不關閉文件會導緻緩沖區(未滿時)最後的内容無法保存到文件中去。
文件指針偏移
寫入單個字符
使用fputc()函數寫入單個字符,用putc()函數也是同樣的作用,是等價的。但是比較名字向文件寫入的時候用fputc(),向控制台stdout寫入時用putc(),這樣讓代碼被閱讀的時候更友好一些。
寫入字符串
使用fputs()函數直接寫入字符串,但是注意和上面的區别,它和puts()函數不是等價關系,puts()是向控制台stdout寫入。
ASCII文件寫入示例
讀取
文件讀取可以使用fgetc()函數按照ASCII字符逐個讀取,也可以使用fgets()按行讀取。
ASCII文件讀取
注意,以上示例中fgets()實際每次讀取長度為49,因為末位要給“\0”留着。
二進制文件寫入與讀取寫入
二進制文件寫入通常使用fwrite()函數。
fwrite()函數
讀取
對應寫入的讀取函數通常使用fread(),讀取的參數要根據寫入數據的字節大小來确定,否則讀取出來的數據就是錯誤的。
fread()函數
fread()和feof()
fread()函數讀取數據時不要使用feof()來判斷是否讀完,因為fread()是“成塊”讀取數據的,讀到最後一塊時feof()仍未到末尾,接着fread()繼續讀取一次feof()才判斷到了結尾,這樣會導緻末尾重複讀取一次。
總結如果我們掌握了文件的讀寫操作,按道理來講在不考慮效率的前提下可以做一個簡單的文件數據庫了,有興趣的可以試試實現最基礎的增删改查功能。
按照《C程序設計》第五版的書本知識章節來說,本節課過後就完結了,從9月19開始剛好一個月的時間,在堅持完成這系列課程的同時,我自己也感覺到了進步,畢竟現代高級語言學多了,會更有想去了解底層的沖動,剛好C語言能輔助拓展自己的一些知識面。
《C程序設計》第五版
盡管書本章節學習完了,基礎知識都過了一遍,但想真正的掌握C語言隻有一條道——實踐,接下來準備從GUI項目開發為切入點來鞏固加深C語言,到時候也會更新在個人媒體上。
盡管目前閱讀量和粉絲都很少,中途确實有打退堂鼓的想法,但是最終還是堅持了下來,也算是給自己一個交代吧。
Anyway,無論是何機緣你讀到了本系列課程,都希望對你有那麼一點幫助。本系列課程是針對初學者特别是在校大學生的,希望大家能學好C語言!
C程序系列一起學《C程序設計》第十一課——鍊表及其操作
一起學《C程序設計》第十課——結構體、共用體以及枚舉類型
一起學《C程序設計》第九課——預處理和動态分配内存
一起學《C程序設計》第八課——指針
一起學《C程序設計》第七課——函數及實戰練習
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!