while (fgetc(fp) != EOF) {
printf("%c", fgetc(fp)); // 第 2 次調用
fputc(fgetc(fp), fp1); // 第 3 次調用
}
每次循環調用 3 次 fgetc:
printf 讀取字符 B 並輸出fputc 讀取字符 C 寫入目標文件結果:文件內容每 3 個字符只寫入第 3 個,屏幕輸出第 2 個,丟失 2/3 數據。
int ch;
while ((ch = fgetc(fp)) != EOF) {
putchar(ch); // 輸出屏幕
fputc(ch, fp1); // 寫入文件
}
核心原則:每次循環只調用一次讀取函數,結果存入變量複用。
char buf[8192];
size_t n;
while ((n = fread(buf, 1, sizeof(buf), fp)) > 0) {
fwrite(buf, 1, n, fp1);
}
| 錯誤模式 | 後果 | 修正 |
|---|---|---|
while(fgetc(fp)!=EOF) fputc(fgetc(fp), fp1) | 跳過一半字符 | 存變量複用 |
feof(fp) 控制循環 | 多寫一次 EOF | 用返回值判斷 |
| 文本模式複製二進制 | Windows 上 \\r\\n 被轉換 | 用 rb/wb |