int fscanf(FILE *stream, const char *format, ...);
EOF(通常為 -1)。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 吃掉換行 |
%s 無長度限制 → 永遠用 %最大長度-1s。fscanf 和 fgets 時,前者留下 \n 導致後者讀空行 → fscanf(fp, "%*[^\n]%*c") 或 fgetc(fp) 清理。%d 對應 long*、%f 對應 double* → 嚴格對應,開啟 -Wformat 警告。while (!feof(fp)) fscanf(...) 會多執行一次 → 直接判斷返回值:while (fscanf(...) == 項目數)。fscanf 為文本模式,讀二進制需用 fread。// 方案 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 組合。