示範如何以 fgetc 或 fscanf 逐字元讀取文字檔,並輸出至標準輸出,包含完整錯誤處理與迴圈結構。
#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;
}
#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;
}
| 特性 | fgetc | fscanf("%c") |
|---|---|---|
| 回傳型別 | int (含 EOF) | int (掃描項目數) |
| 字元儲存 | 直接回傳 | 透過指標參數 |
| EOF 處理 | 自然融入迴圈條件 | 需搭配 feof() |
| 效能 | 較高 (無格式解析) | 較低 |
| 空白字元 | 逐一讀取 | 預設跳過空白 (需 %c 才不跳過) |
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 ch; while((ch=fgetc(fp))!=EOF) 錯誤!EOF 通常是 -1,char 可能是 unsigned,導致無限迴圈。必須用 int。while(!feof(fp)) 迴圈會多執行一次,正確寫法是將讀取操作放在迴圈條件中。"r" 會轉換 \r\n → \n,二進位檔需用 "rb"。fgetsfgetc (int 接收)freadfscanf (注意回傳值檢查)fread 讀入記憶體