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

C 語言檔案讀取與字元編碼:fgetc 回傳 int 與 ASCII 值解析

     編輯:程式設計疑難解答

現象

int c = fgetc(f);
while (c != EOF) {
    printf("%d ", c); // 輸出 48 32 49 32 ... (ASCII 碼)
    c = fgetc(f);
}

檔案內容 0 1 2 2 0,輸出為對應 ASCII 值:'0'=48, ' '=32, '1'=49, '2'=50。

關鍵點解析

概念說明
fgetc 回傳 int需用 int 接收,以容納 EOF (通常為 -1),char 可能截斷
字元 vs ASCII讀取文字檔實際讀到的是字元編碼值 (ASCII/UTF-8 位元組)
列印字元printf("%c", c) 列印字元;printf("%d", c) 列印編碼值

強制轉型錯誤

int i;
i = (int)c; // C89 不支援這種轉型語法?實際上合法,可能是其他語法錯誤
// 正確寫法
i = (int)c; // C 標準允許
// 或直接用
int i = c;  // 隱式轉型

完整正確讀取範例

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *f = fopen("data.txt", "r");
    if (!f) { perror("開檔失敗"); return 1; }
    
    int c;
    while ((c = fgetc(f)) != EOF) {
        // 同時顯示字元與編碼
        printf("字元: '%c' (ASCII: %d)\n", c, c);
    }
    
    fclose(f);
    return 0;
}

Windows 特有:fopen_s 與 errno_t

FILE *f;
errno_t err = fopen_s(&f, "data.txt", "r");
if (err) { printf("錯誤碼: %d\n", err); return 1; }

編碼轉換提醒

  • 文字檔實為位元組流,編碼由建立者決定 (ASCII/UTF-8/Big5...)
  • 讀取中文需對應編碼解碼,單純 fgetc 只能得單一位元組
  • C 標準庫無內建編碼轉換,需用 iconv、ICU 或平台 API
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved