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

C 語言 fscanf 跳過第一行:文件編碼 BOM 導致讀取異常

     編輯:程式設計綜合問答

現象

文件 ride.in 內容:
COMETQ HVNGAT
fscanf(input, "%s %s", comet, group);
輸出卻只有 HVNGAT。

原因:UTF-8 BOM

文件以 **UTF-8 with BOM** 保存,開頭 3 字節 EF BB BF。
fscanf 讀取第一個 %s 時,跳過空白字符,**但 BOM 不屬於空白字符**,被作為第一個 token 讀入 comet (顯示為亂碼或空),導致第二個 %s 讀到 HVNGAT。

解決方法

1. 保存為無 BOM 編碼 (推薦)

  • Notepad++:編碼 → 轉為 UTF-8 (無 BOM)。
  • VS Code:右下角「UTF-8 with BOM」點擊 → 「Save without BOM」。

2. 代碼層面跳過 BOM

FILE *fp = fopen("ride.in", "rb"); // 二進制模式
unsigned char bom[3];
fread(bom, 1, 3, fp);
if (!(bom[0]==0xEF && bom[1]==0xBB && bom[2]==0xBF)) {
    fseek(fp, 0, SEEK_SET); // 無 BOM,回退
}
// 後續用 fscanf(fp, ...) 或 fgets 解析

3. 使用 fgets + sscanf

char line[256];
fgets(line, sizeof(line), fp); // 讀整行
// 手動去除可能的 BOM
if (strncmp(line, "\xEF\xBB\xBF", 3) == 0) memmove(line, line+3, strlen(line)-2);
sscanf(line, "%s %s", comet, group);

最佳實踐

**約定項目文件統一使用 UTF-8 無 BOM**,避免跨平台、跨語言解析異常。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved