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

C語言檔案操作:讀取文字檔內容顯示於螢幕

     編輯:關於C

檔案讀取基礎:字元逐一讀取與顯示

示範如何以 fgetc 或 fscanf 逐字元讀取文字檔,並輸出至標準輸出,包含完整錯誤處理與迴圈結構。

方法一:fgetc (推薦)

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

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (!fp) {
        perror("無法開啟 data.txt");
        return 1;
    }
    
    int ch; // 必須用 int 接收 EOF
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }
    
    fclose(fp);
    return 0;
}

方法二:fscanf (原始碼風格)

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (!fp) {
        printf("can not open!\n");
        return 1;
    }
    
    char ch;
    // 先讀一個字元
    if (fscanf(fp, "%c", &ch) == 1) {
        while (!feof(fp)) {
            putchar(ch);
            fscanf(fp, "%c", &ch);
        }
    }
    
    fclose(fp);
    return 0;
}

關鍵差異比較

特性fgetcfscanf("%c")
回傳型別int (含 EOF)int (掃描項目數)
字元儲存直接回傳透過指標參數
EOF 處理自然融入迴圈條件需搭配 feof()
效能較高 (無格式解析)較低
空白字元逐一讀取預設跳過空白 (需 %c 才不跳過)

進階讀取方法

逐行讀取 (fgets) - 最常用

char line[1024];
while (fgets(line, sizeof(line), fp)) {
    printf("%s", line); // fgets 保留換行符
}

整檔讀入記憶體

long size;
fseek(fp, 0, SEEK_END);
size = ftell(fp);
fseek(fp, 0, SEEK_SET);

char *buffer = malloc(size + 1);
fread(buffer, 1, size, fp);
buffer[size] = '\0';
printf("%s", buffer);
free(buffer);

二進位檔案讀取

// 讀取結構體陣列
struct Record { int id; char name[32]; float score; };
struct Record rec;
while (fread(&rec, sizeof(rec), 1, fp) == 1) {
    printf("%d %s %.2f\n", rec.id, rec.name, rec.score);
}

常見錯誤避坑

  • char 接收 fgetc:char ch; while((ch=fgetc(fp))!=EOF) 錯誤!EOF 通常是 -1,char 可能是 unsigned,導致無限迴圈。必須用 int。
  • feof 濫用:while(!feof(fp)) 迴圈會多執行一次,正確寫法是將讀取操作放在迴圈條件中。
  • 未檢查 fopen:直接使用 NULL 指標導致崩潰。
  • 文字/二進位模式混淆:Windows 下 "r" 會轉換 \r\n → \n,二進位檔需用 "rb"。

最佳實務總結

  1. 文字檔逐行處理:fgets
  2. 文字檔逐字元:fgetc (int 接收)
  3. 二進位固定大小記錄:fread
  4. 格式化文字解析:fscanf (注意回傳值檢查)
  5. 整檔小檔案:fread 讀入記憶體
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved