這一篇 我帶大家復習一下,C語言中的文件 那一部分
大家注意 這里的圖并非原創 是當時我老師的圖片?
本片作用主要是 后續會有文件相關操作,這篇幫大家復習C語言文件中的內容 有助于大家后面的理解。
文章中代碼大多是圖片格式,是因為這是我當時學的時候記得筆記,當時為了方便閱讀,都以截圖的方式記錄,找不到源碼的,我截取了老師當時的源碼,并不是沒有理解的搬運過程,謝謝理解!!希望對你有所幫助
?
知識點1【文件的概述】
1、文件的分類(存儲介質)
磁盤文件:文件的數據存在磁盤上(音視頻,圖片文件,文檔文件)
設備文件:通過系統將外部設備具體成文件
2、文件分類(存儲方式)
任何磁盤文件 在物理上的都是二進制存儲(計算機只能識別01)
邏輯上:硬盤文件分為二進制文件、文本文件
文本文件:基于字符編碼的文件
二進制文件:基于值編碼的文件
文本文件:
基于字符編碼,常見編碼ASCII,Unicode等
一般可以用文本編輯器直接打開
例如:數 5678 的以 ASCII 存儲形式為:
ASCII 碼:00110101 00110110 00110111 00111000
歌詞文件(lrc):文本文件
二進制文件:
基于值編碼,把內存中的數據原樣輸出到磁盤上
一般需要自己判斷或使用特定軟件分析數據格式
例如:數 5678 的存儲形式為: 二進制碼:0001 0110 0010 1110
文本文件和二進制文件的區別
文本文件
優點:
一個字節一個意思,便于查看 :可以直接使用char *p 指向首元素位置,%c打印
缺點:
空間大:一個碼一個字節
效率低:將內存數據 進行ASCII碼轉換后,再存儲到磁盤
二進制文件
二進制文件
優點:
空間小:原樣存儲(內存怎么寫,硬盤怎么存),按照數據大小分配空間
效率高:不需要來回轉換
缺點:
數據不定長,不方便查看
還有以下區別
注意:
寫代碼 是操作內存;
也可以直接編輯硬盤中的文件
當要用文件區分是哪個系統時:
現在各系統的磁盤文件的分別輸入換行操作,在內存rb(二進制文件讀取)打開文件,字符查找\r即可
利用知識點
在windows下換行是\r\n,Linux下是\n
文本文件 有一個轉換的過程
二進制文件 數據原樣存儲與提取
知識點2【文件緩沖區】
緩沖區的目的
1、文件緩沖區的刷新方式
1、行刷新(遇到換行符 刷新)
2、滿刷新(緩沖區數據放滿 刷新)
這個的現象時我們可以每隔一段時間就會看到 終端上刷新數據
3、強制刷新(使用ffulsh函數 刷新)
4、結束刷新 (關閉文件的時候 將緩沖區的數據 全部刷新)
2、模擬時鐘
\r 回到行首
知識點3【文件指針】
文件的指針類型 FILE *
用戶定義一個指針變量
指針變量指明文件信息的起始地址 通過庫函數去操作文件即可
此時的文件指針指向的地址并不是文件的真實地址,真實地址在磁盤中,這時指向的是用fopen后,產生的文件信息的首地址
庫函數借助流指針操作磁盤文件
還有 fflush 中 使用的fflush(stdout) 強制刷新到當前輸出終端(屏幕)
使用fgets時 使用fgets(buf,sizeof(buf),stdin)
知識點4【文件的API】
文件的操作步驟 打開 讀寫 關閉
1、打開文件fopen
返回值:
成功:成功打開的文件的地址
失敗:NULL
path
是 文件的路徑,包含文件名
指針類型可以做字符串的首地址 而路徑保存在字符串中
如
char* p= “/home/work/c/day07/a.txt”;
/home/work/c/day07/a.txt 為文件的路徑
fopen(p,mode)
mode為打開文件的方式 以讀 寫 可讀可寫 追加的方式打開
文件的打開方式mode:
r:只讀
w:只寫
a:追加方式打開
+:可讀可寫的方式打開
t:以文本文件方式打開(默認省略 即r默認打開文本文件)
b:以二進制文件方式打開(必須顯式說明 讀的時候必須是rb)
模式間可以組合
文件信息的空間在fopen調用后自動生成,無需用戶創建,只需要用文件指針變量取接地址即可
2、關閉文件fclose
兩個動作
1、刷新緩沖區,把緩沖區剩下的數據刷新到文件中
2、每個文件都申請了一個堆區空間,即調用fopen時,生成的FILE* fp 指向的區域(文件信息),將其釋放
以上兩個動作在庫函數fclose 中進行
若上式沒有return;
會出現段錯誤,因為若無return; 函數會繼續執行到fclose 會訪問fp的地址(NULL),出現段錯誤
3、一次讀寫一個字符
fputc fgetc
fputc(寫操作)
EOF(end of file)是stdio.h中的一個宏定義,值為-1
注意:EOF只在文本文件中有效,文本文件中存的是字符(0~128),可用-1表示文件結束;然而二進制文件中存的是數值,數據原樣輸出,-1被當作數值處理無特殊含義
案例
fgetc(讀操作)
案例
補充
fgets 內部流指針控制,讀完一個自動都下一個,不用手動++
注:文件內部是沒有EOF的,是系統判斷指針已經指向文件末尾,系統會給一個EOF
流 的概念:在編程中都是以字節為單位出的
EOF 打印出來
我們從磁盤中打開文件 會發現是亂碼
4、一次讀寫一個字符串
fputs fgets
fputs(寫操作)
返回值:該函數返回一個非負值,如果發生錯誤則返回 EOF(-1)
把字符串寫進文件時,‘\0’并不算文件大小,因為文件的空間大,初始化為0('\0' = 0),可見'\0'在文件中并沒有特殊含義,并不能算一個字節
fgets(讀操作)
與到換行符或者文件末尾結束讀取
一次只能讀取個字節
或者在讀取 size-1 個字節停止(size-1:最后一個字節存放'\0'結束字符串)
會獲取回車與空格
需要將buf[strlen[buf] - 1] = 0;
案例
實現 將一個文件 中的內容轉移到另一個文件
5、一次讀寫n塊字符串
fwrite fread
fwrite(寫操作)
將內存數據原樣寫入 硬盤文件中
返回值是實際寫入的塊數即nmemb
不做轉換不方便閱讀
案例
fread(讀操作)
將磁盤數據 原樣輸入到 內存
返回值:實際讀到的塊數,若每塊100,nmenb為5,文件中有250給字節,則返回值為2
案例
使用:大文件拷貝,只要不需要在終端上查看就可以用write
優點:快
缺點:不方便查看
6、格式化讀寫
有一個轉換的過程 方便查看
fprintf fscanf
慢 但是閱讀性高
fprintf (寫操作)
想一下sprintf
是將數據先轉化為字符后,存入數組中,而fprintf是先轉化字符后存入文件中
可知過程 內存數據變為數組,在存入文件
案例
fscanf (讀操作)
知識點5 隨機讀寫
文件默認是順序讀寫:讀寫才能移動流指針,用戶不能修改
隨機讀寫:用戶可以更改文件流指針的位置(使用函數實現)
1、引入案例
如果沒有紅色框內的部分,直接讀取,是得不到內容的,因為流指針的位置沒有在起始位置
2、隨機讀寫的API
fseek rewind ftell
1、rewind 復位文件流指針
2、ftell 返回文件流指針 距離文件首部的字節數
再次強調:‘\0’在文件中無特殊含義,不算文件大小
3、fseek 文件流指針定位
參數3
參數2
案例(重點)
一次性讀取文件數據
回顧
windows下即在VS code 中編輯文本時輸入回車,大小為2個字節
當在linux下vim編輯文本,輸入回車,大小為1個字節
結束
代碼需要手敲,才能更好的理解。希望今天的內容對你能夠有所幫助,如果你喜歡我的分享,請點贊收藏加關注,謝謝大家!!