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

C 語言 freopen 重定向標準輸入輸出:最簡潔的文件 I/O 技巧

     編輯:關於C語言

一行代碼實現「標準流 ⇄ 文件」無縫切換

在競技程式設計、批次測試、日誌記錄等場景,常需將 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,跨平台,最推薦
  • Shell 重定向 ./prog < in.txt > out.txt:零代碼侵入,但 Windows cmd 管道行為略異
  • fscanf/fprintf 顯式文件指標:靈活度最高,但需修改所有 I/O 調用

掌握 freopen,讓你的 C 程式在「互動模式」與「批次模式」間自由切換,大幅提升開發測試效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved