在掌握了C語言鏈表的創建、遍歷、插入與刪除等操作後,如何將內存中的鏈表數據持久化保存到文件,並在需要時讀取回來進行處理,就需要用到文件輸入輸出(I/O)的相關知識。即使不懂鏈表,只要具備指針基礎,也能輕鬆學習文件操作。本文整理自《C語言程序設計教程——人民郵電出版社》第十二章,系統梳理文件操作的核心概念與常用函數。
不同的外圍設備對數據輸入輸出的格式和處理方式各異,這增加了編程難度並易導致設備不兼容。數據流解決了這一問題:它將文件視為一串連續的字符(字節)流,無記錄限制。程序通過文件指針訪問數據,指針指向的位置即為當前處理的數據,讀寫後自動後移。每個文件末尾都有EOF(End Of File)標記,指針指到EOF即表示讀取完畢。
文件是存放在外部存儲介質(磁盤、光盤等)上的數據集合。C語言支持流式文件,視文件為字節序列,以字節為單位訪問,無記錄界限,輸入輸出的開始和結束完全由程序控制。
ASCII與二進制文件的關鍵區別:
| 維度 | ASCII文件 | 二進制文件 |
|---|---|---|
| 存儲形式 | 轉為可顯示字符存儲 | 按內存原始二進制形式存儲 |
| 空間佔用 | 較大,與數值大小相關 | 較小,固定長度 |
| 讀寫速度 | 無需轉換,較快 | 需轉換,相對較慢 |
| 典型用途 | 存放輸入數據、最終結果 | 暫存程序中間結果 |
標準輸入設備(鍵盤)和標準輸出設備(屏幕)在C語言中均作為ASCII文件處理,分別稱為標準輸入文件(stdin)和標準輸出文件(stdout)。
使用 fopen() 打開文件,原型為:FILE *fopen(char *filename, char *mode);。mode 參數指定文件類型(文本/二進制)及訪問模式(讀/寫/追加等)。打開後必須檢查返回值是否為 NULL 以判斷是否成功。
FILE *fp;
fp = fopen("file.txt", "r");
if (fp == NULL) {
printf("無法打開文件!\n");
exit(1);
}
使用 fclose(fp) 關閉文件,返回 0 表示成功。系統自動打開的標準設備文件(stdin, stdout, stderr)由系統自行關閉。此外,可通過 fileno(fp) 獲取文件描述符,再用 filelength(handle) 獲取文件大小。
順序讀寫指從文件開頭逐個數據讀取或寫入,主要函數成對出現:
fgetc() / fputc()int fgetc(FILE *fp):讀取指針處字符,指針後移;到達EOF返回-1。int fputc(char ch, FILE *fp):寫入字符;成功返回字符ASCII碼,失敗返回EOF。fgets() / fputs()char *fgets(char *str, int n, FILE *fp):讀取最多 n-1 個字符至 str,遇換行符或EOF停止,自動加 \0。int fputs(char *str, FILE *fp):寫入字符串(不含結束符 \0),不自動換行;成功返回非0,失敗返回EOF。注意:連續 fputs 寫入的字符串會首尾相連,讀取時難以分割,建議人為添加 \n 作為分隔。
fscanf() / fprintf()int fscanf(FILE *fp, "format", ...):按格式從文件讀取數據到變量;成功返回讀取項數,失敗返回EOF。int fprintf(FILE *fp, "format", ...):按格式將變量值寫入文件;成功返回輸出字符數,失敗返回負值。數據之間應用空格隔開,便於後續 fscanf 正確讀取。
fread() / fwrite()int fread(void *buffer, int size, int count, FILE *fp):從文件讀取 count 個大小為 size 的數據塊到 buffer;返回實際讀取的塊數。int fwrite(void *buffer, int size, int count, FILE *fp):將 buffer 中的數據塊寫入文件;返回實際寫入的塊數。這兩個函數是處理二進制文件(如結構體數組)的核心工具。
隨機讀寫的關鍵在於移動文件位置指針(定位),主要函數有:
void rewind(FILE *fp):將指針移至文件開頭。int fseek(FILE *fp, long offset, int whence):從 whence(SEEK_SET開頭、SEEK_CUR當前、SEEK_END結尾)偏移 offset 字節。成功返回0,失敗返回-1。注意:若向文件尾偏移超出範圍,指針停在文件尾且返回0;向文件頭偏移超出範圍則返回-1且指針不變。long ftell(FILE *fp):返回當前指針距文件開頭的字節偏移量;出錯返回-1L。int putw(int w, FILE *fp) / int getw(FILE *fp):以二進制形式寫入/讀取一個整數(主要用於二進制文件)。掌握數據流概念、文件打開關閉、順序讀寫(字符、字符串、格式化、數據塊)以及隨機讀寫(定位函數)是C語言文件操作的基石。實際開發中,應根據數據類型(文本/二進制)、訪問模式(順序/隨機)選擇合適的函數組合,並始終檢查返回值以確保操作成功。