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

C語言文件輸入輸出進階:freopen 重定向標準流實現 ACM 模式

     編輯:關於C

競程(ACM/ICPC)標準輸入輸出常需從文件讀寫。freopen 可直接重定向 stdin/stdout,無需修改 scanf/printf 調用,極大簡化代碼。本文詳細講解用法、跨平台控制台恢復與模板代碼。

freopen 原型


FILE *freopen(const char *filename, const char *mode, FILE *stream);
參數說明
filename目標文件路徑
moder/w/a 等,同 fopen
stream標準流:stdin/stdout/stderr

核心用法:重定向 stdin/stdout


// 輸入重定向:從 slyar.in 讀取
freopen("slyar.in", "r", stdin);

// 輸出重定向:寫入 slyar.out
freopen("slyar.out", "w", stdout);

之後所有 scanf 讀 slyar.in,所有 printf 寫 slyar.out,**業務代碼零修改**。

完整競程模板


#include <stdio.h>

int main() {
    freopen("slyar.in", "r", stdin);
    freopen("slyar.out", "w", stdout);
    
    /* 業務邏輯:直接用 scanf/printf */
    int a, b;
    scanf("%d %d", &a, &b);
    printf("%d\n", a + b);
    
    fclose(stdin);
    fclose(stdout);
    return 0;
}

恢復控制台(交互調試)

平台恢復 stdin恢復 stdout
DOS/Windowsfreopen("CON", "r", stdin);freopen("CON", "w", stdout);
Linux/Unixfreopen("/dev/tty", "r", stdin);freopen("/dev/tty", "w", stdout);

也可用 /dev/console(需權限)。

進階技巧

錯誤輸出單獨文件


freopen("error.log", "w", stderr);

追加模式保留歷史


freopen("log.txt", "a", stdout);  // 追加不覆蓋

管道配合(Linux)


// 編譯時不指定文件,運行時用管道
./prog < input.txt > output.txt 2> error.txt
// 程式碼無需 freopen,shell 完成重定向

注意事項

  • freopen 會關閉原流再打開新文件,失敗返回 NULL
  • 重定向後 fclose(stdin) 會關閉文件,**不可再次使用 stdin**
  • Windows CON 設備名不區分大小寫
  • 多線程中重定向標準流**不安全**,影響全進程
  • 嵌入式無文件系統時,可重定向到 UART 緩衝區

對比:freopen vs fscanf/fprintf

總結

freopen 是競程、批處理、測試驅動開發的利器。掌握「重定向標準流 → 業務邏輯不變 → 最後關閉」模式,能極大提升開發測試效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方式優點缺點
freopen + scanf/printf代碼簡潔、零侵入、標準流語義難以多文件並行、線程不安全
fopen + fscanf/fprintf多文件並行、可控生命週期、線程安全需修改所有 IO 調用