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

C/C++ fputc/fgetc 處理 ASCII 0-127 遇 EOF 提前結束?必須用二進制模式

     編輯:程式設計綜合問答

問題現象

循環寫入 0~126 的 ASCII 字元到文件,讀取時在第 26 個字元(0x1A,即 Ctrl+Z)遇到 EOF 導致程序提前結束。

根本原因

Windows 文本模式("r"/"w")下,0x1A 被視為文件結束標記。讀取 fgetc 遇到該字節即返回 EOF,寫入 fputc 可能將其轉換或截斷。

解決方案

// 寫入
FILE *out = fopen("1.txt", "wb"); // 二進制寫入
// 讀取
FILE *in = fopen("1.txt", "rb");  // 二進制讀取

關鍵點總結

  • 處理非文本數據(圖片、序列化結構、完整 ASCII 表)必須使用 "rb"/"wb"。
  • 文本模式下 Windows 會進行 \n <-> \r\n 轉換,且將 0x1A 視為 EOF。
  • Linux/Unix 無此限制,但為跨平台一致性,建議統一採用二進制模式。

補充:feof 迴圈寫法修正

int c;
while ((c = fgetc(in)) != EOF) { // 直接用返回值判斷
    printf("%d: %c\n", t++, c);
}

避免 while(!feof(in)) 導致多讀一次的經典陷阱。

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