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

C語言 fscanf 用法詳解:格式化文件讀取與陷阱避坑

     編輯:C 語言問答

fscanf 核心特性與 scanf 差異

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

  • 功能:從文件流按格式讀取數據,賦值給參數列表。
  • 返回值:成功轉換賦值的項目數;輸入失敗或 EOF 返回 EOF(通常為 -1)。
  • 分隔符處理:遇空格、換行、制表符均視為分隔符並跳過(%c、%[ 掃描集除外),這與 fgets 整行讀取本質不同。

基本語法示例

FILE *fp = fopen("data.txt", "r");
if (!fp) return -1;

char name[20];
int age;
double score;

while (fscanf(fp, "%19s %d %lf", name, &age, &score) == 3) {
    printf("姓名:%s 年齡:%d 成績:%.1f\n", name, age, score);
}
fclose(fp);

假設 data.txt 內容:

ZhangSan 18 92.5
LiSi 20 88.0

常用格式控制符

格式符含義對應參數類型注意
%d有符號十進制整數int *
%ld長整數long *
%f / %lf單/雙精度浮點數float * / double *scanf 系 %f 對應 float*,printf 系 %f 通用
%s非空白字符串char ***必須限制寬度**如 %19s 防溢出
%c單字符(含空白)char *不跳過空白,讀取下一字符
%[^\\n]掃描集:讀至換行char *可讀含空格行,需配合 %*c 吃掉換行

高頻陷阱與對策

  1. 緩衝區溢出:%s 無長度限制 → 永遠用 %最大長度-1s。
  2. 換行符殘留:混用 fscanf 和 fgets 時,前者留下 \n 導致後者讀空行 → fscanf(fp, "%*[^\n]%*c") 或 fgetc(fp) 清理。
  3. 類型不匹配:%d 對應 long*、%f 對應 double* → 嚴格對應,開啟 -Wformat 警告。
  4. EOF 判斷錯誤:while (!feof(fp)) fscanf(...) 會多執行一次 → 直接判斷返回值:while (fscanf(...) == 項目數)。
  5. 二進制文件誤用:fscanf 為文本模式,讀二進制需用 fread。

對比:fscanf vs fgets + sscanf

// 方案 A:逐行讀取再解析(推薦,健壯性強)
char line[256];
while (fgets(line, sizeof(line), fp)) {
    if (sscanf(line, "%19s %d %lf", name, &age, &score) == 3)
        process(name, age, score);
}

// 方案 B:直接 fscanf(簡潔,但對格式敏感)
while (fscanf(fp, "%19s %d %lf", name, &age, &score) == 3)
    process(name, age, score);

方案 A 能定位行號、跳過壞行、處理空行,工程實踐中更推薦。

總結

  • fscanf 適合**結構固定、純文本、無空格字段**的簡單配置/數據文件。
  • 涉及**含空格字符串、錯誤恢復、行號報告**時,首選 fgets + sscanf 組合。
  • 務必檢查返回值、限制字符串寬度、關閉文件句柄。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved