在競技程式設計、批次測試、日誌記錄等場景,常需將 stdin/stdout 重定向至文件。C 標準庫提供 freopen,無需修改任何 scanf/printf 調用即可完成切換。
// 程式開頭
freopen("input.txt", "r", stdin); // 標準輸入 ← 文件
freopen("output.txt", "w", stdout); // 標準輸出 → 文件
// 正常使用 scanf/printf/cin/cout
int x; scanf("%d", &x);
printf("Result: %d\n", x);
// 程式結尾(可選,進程結束自動關閉)
fclose(stdin);
fclose(stdout);
return 0;
| 場景 | 優點 | 注意事項 |
|---|---|---|
| OJ 批次測試 | 零代碼改動,本地開發直接跑樣例 | 提交前務必註釋或刪除 freopen |
| 大量輸出導向日誌 | 無需修改既有 printf,效能等同 fprintf | 長時間運行建議定期 fflush(stdout) |
| 交互式程式調試 | 輸入文件預置測試用例,避免手工重複輸入 | 需確保輸入格式與程式預期完全一致 |
FILE *fin = freopen("in.txt", "r", stdin);
if (!fin) { perror("open in.txt failed"); return 1; }
FILE *fout = freopen("out.txt", "w", stdout);
if (!fout) { perror("open out.txt failed"); return 1; }
// ... 核心邏輯 ...
// 還原終端機(需 POSIX 支援)
freopen("/dev/tty", "r", stdin);
freopen("/dev/tty", "w", stdout);
printf("已還原終端機輸出\n");
freopen:標準 C,跨平台,最推薦./prog < in.txt > out.txt:零代碼侵入,但 Windows cmd 管道行為略異fscanf/fprintf 顯式文件指標:靈活度最高,但需修改所有 I/O 調用掌握 freopen,讓你的 C 程式在「互動模式」與「批次模式」間自由切換,大幅提升開發測試效率。