首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言文件讀寫四大模式深度對比:字元、字串、塊、格式化操作完整實戰指南

     編輯:關於C語言

四大讀寫模式總覽

模式函數對單位適用場景關鍵特性
字元fgetc/fputc1 字節逐字元處理、簡單過濾每次 1 字節,低效
字串fgets/fputs行/字串文本行讀取、配置檔解析遇 \n 停止,自動加 \0
塊fread/fwrite任意結構體二進制序列化、結構體陣列原始記憶體映射,高效
格式化fscanf/fprintf文本欄位文本報表、日誌、CSV 類人類可讀,自動型別轉換

一、字元讀寫:fgetc/fputc


int fputc(int ch, FILE* fp); // 成功返回寫入字元,失敗 EOF
int fgetc(FILE* fp);         // 成功返回字元(0-255),失敗 EOF

關鍵細節:

  • fputc 只寫入 ch 低 8 位(ch & 0xFF)
  • fgetc 返回 int 而非 char,必須用 int 接收 以區分有效 0xFF 與 EOF(-1)
  • 二進制檔中 0xFF 合法,若用 char 接收會誤判為 EOF

二、字串讀寫:fgets/fputs


int fputs(const char* s, FILE* fp);
char* fgets(char* s, int n, FILE* fp); // 讀 n-1 字元或遇 \n 止,補 \0

關鍵行為:fgets 遇 \n 會將 \n 讀入緩衝區並停止。這是區分「空行」與「檔案結束」的關鍵。

三、塊讀寫:fread/fwrite(二進制序列化王者)


size_t fread(void* ptr, size_t size, size_t nmemb, FILE* fp);
size_t fwrite(const void* ptr, size_t size, size_t nmemb, FILE* fp);
  • size:單個元素大小(通常 sizeof(Struct))
  • nmemb:元素個數
  • 返回值:成功讀寫的元素個數(而非字節數)
  • 鐵律:fwrite 寫入必配 fread 讀取,勿混用格式化/字串函數

四、格式化讀寫:fscanf/fprintf(人類可見文本)


int fprintf(FILE* fp, const char* format, ...);
int fscanf(FILE* fp, const char* format, ...);

本質差異:格式化將 int 32768 寫為 5 字元 '3','2','7','6','8'(佔 5 字節),而塊寫入佔 4 字節原始二進制。格式化 = 型別轉字串 + 寫入。

完整對比實測程式碼


typedef struct { char name[20]; double score; int age; } Student;
Student s1[3] = {{"liudehua",85.5,45},{"zhangxueyou",79.3,47},{"guofucheng",83.4,43}};
Student s2[3];
FILE* fp = fopen("test.txt", "wb+");

// 1. 塊寫入
fwrite(s1, sizeof(Student), 3, fp);
rewind(fp);
fread(s2, sizeof(Student), 3, fp); // 完美還原

// 2. 格式化寫入
for (int i=0;i<3;i++)
    fprintf(fp, "%s %lf %d\n", s1[i].name, s1[i].score, s1[i].age);
rewind(fp);
for (int i=0;i<3;i++)
    fscanf(fp, "%s %lf %d", s2[i].name, &s2[i].score, &s2[i].age);

// 3. 文本 vs 二進制模式差異
fprintf(fp, "%d", 32768); // 文本模式寫 5 字節 '3','2','7','6','8'
fwrite(&n, sizeof(int), 1, fp); // 二進制寫 4 字節 0x00 0x80 0x00 0x00

檔案內容十六進制對比(核心洞察)

方式檔案內容大小可讀性
塊寫入原始記憶體映射(含結構體填充位元組)固定不可讀
格式化人類可讀文本(數字轉字元、含分隔符)可變可讀
文本模式\n → \r\n (Windows)略大可讀
二進制模式位元組原樣精確不可讀

選型決策樹

  1. 資料需人類閱讀/跨語言解析 → 格式化 + 文本模式
  2. 高效能、大量結構體、同程式讀寫 → 塊讀寫 + 二進制模式
  3. 逐行處理文本、配置檔 → 字串讀寫
  4. 逐字元過濾、簡單轉換 → 字元讀寫

避坑總結

  • fgetc 必須用 int 接收
  • fgets 會保留 \n,處理時需去除
  • fread/fwrite 成對使用,結構體填充位元組會寫入檔案(跨平台/跨編譯器不兼容)
  • fscanf 格式字串需精確匹配輸入,失敗會留下垃圾字元導致後續讀取錯位
  • 二進制資料永遠用 "wb"/"rb" 打開
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved