單文件演示:以讀模式打開文件讀取內容、以寫模式創建文件寫入數據、將文件 1 內容逐塊複製到文件 2。
#include#include #define BUFSIZE 64 int main() { char buf[BUFSIZE] = "hello world!"; /* ---------- 1. 讀取文件 ---------- */ FILE *fp = fopen("./file1", "r"); if (!fp) { perror("open file1 for read"); exit(EXIT_FAILURE); } size_t n = fread(buf, 1, BUFSIZE - 1, fp); buf[n] = '\0'; printf("Read %zu bytes: %s\n", n, buf); fclose(fp); /* ---------- 2. 寫入文件 ---------- */ FILE *fp2 = fopen("./file1", "w"); if (!fp2) { perror("open file1 for write"); exit(EXIT_FAILURE); } fwrite(buf, 1, strlen(buf), fp2); fclose(fp2); /* ---------- 3. 文件複製 ---------- */ FILE *src = fopen("./file1", "r"); if (!src) { perror("open src"); exit(EXIT_FAILURE); } FILE *dst = fopen("./file2", "w"); if (!dst) { perror("open dst"); exit(EXIT_FAILURE); } while (1) { size_t n = fread(buf, 1, 20, src); // 每次 20 字節 if (n == 0) break; // EOF 或錯誤 fwrite(buf, 1, n, dst); } fclose(src); fclose(dst); printf("Copy done.\n"); return 0; }
| 函數 | 關鍵參數 | 返回值 | 注意 |
|---|---|---|---|
| fopen | 路徑, 模式("r"/"w"/"a"/"rb"/"wb"…) | FILE* / NULL | 必須檢查 NULL |
| fread | buf, 元素大小, 元素個數, fp | 成功讀取元素數 | 返回值 < 個數 表示 EOF 或錯誤 |
| fwrite | buf, 元素大小, 元素個數, fp | 成功寫入元素數 | 返回值 < 個數 表示磁盤滿/錯誤 |
| fclose | FILE* | 0 成功 / EOF 失敗 | 刷新緩衝區、釋放結構體 |
while(!feof(fp)) fgetc(fp) 會多讀一次。正確:while((ch=fgetc(fp))!=EOF) 或 while(fread(...))"r" 會將 \r\n 轉 \n,二進制用 "rb" 保持原樣BUFSIZ)文件操作核心四步:打開 → 檢查 → 讀/寫循環 → 關閉。掌握 fread/fwrite 塊操作配合返回值判斷 EOF,是高效、正確處理二進制/文本文件的關鍵。