C 語言標準函數庫分類導覽 - stdio.h freopen()

stdio.h 的函數 freopen() 可以打開檔案,然後將處理檔案的必要資訊儲存給回傳的 FILE 的結構,總共需要三個參數,前兩個為字串,第一個字串為檔案名稱,第二個字串則是開啟模式,第三個參數為串流流向。



開啟模式如下列表
模式功能
"r"讀取文字檔案
"w"新建文字檔案並寫入資料
"a"將資料附加在該文字檔案之後
"rb"讀取二進位檔
"wb"新建二進位檔並寫入資料
"ab"將資料附加在該二進位檔之後
"r+"讀取文字檔案並寫入資料
"w+"新建文字檔案並讀取、寫入資料
"a+"讀取文字檔案將附加資料在檔案最後
"rb+" 或 "r+b"讀取二進位檔並寫入資料
"wb+" 或 "w+b"新建二進位檔並讀取、寫入資料
"ab+" 或 "a+b"讀取二進位檔將附加資料在檔案最後


所謂的串流流向是指資料行進的方向,串流的英文原文為 stream ,原意就是水流,因為由輸入設備取得資料便像是有一長串電子流進入電腦之中,而將資料輸出到其它裝置的情況也極為類似。由標準輸入裝置取得資料稱為 stdin ,而將資料傳送到標準輸出裝置稱為 stdout ,另有 stderr 專門記錄錯誤的串流資訊。


以下程式示範將原本要顯示於螢幕的文字寫入檔案之中
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fPtr;
    char c;
    
    fPtr = freopen("oldname.txt", "w", stdout);
    if (!fPtr) {
        printf("檔案建立失敗...\n");
        exit(1);
    }
    
    printf("Nature, time, and patience are three great physicians.\n");
    printf("Easier said than done.\n");
    printf("To teach a fish how to swim.\n");
    
    fclose(fPtr);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:cfreopen.c
    功能:示範 stdio.h 中函數 freopen() 的使用
    作者:張凱慶
    時間:西元2010年6月 */


編譯後執行,結果如下



您可以繼續參考


4 則留言:

勝文 提到...

請問一下
我一直搞不懂fopen和freopen有甚麼差別
可以大概跟我說一下嗎?

Kaiching Chang 提到...

fopen 僅止於開啟或建立檔案, freopen 除了開啟或建立檔案之外,還可以指定將 stdin 或 stdout 的內容寫進檔案之中,如上例便是先建立一個 oldname.txt ,然後將接下來 printf() 內容都寫進檔案之中。

Unknown 提到...

不好意思 我還是有點不了解 stdin 跟stdout 的意思?? printf()的訊息不是應該只會印在螢幕上嗎? 那為什麼會寫入檔案中呢?? 還是stdin是鍵盤輸入 而stdout是螢幕輸出 所以才能寫到檔案中!!

Kaiching Chang 提到...

printf()不是只會印在螢幕上唷!它是將字串輸出到標準輸出裝置 stdout ,標準輸出裝置可以是螢幕、檔案、印表機或任何你可以拿來接電腦輸出的東西。而 freopen() 就是將標準輸出裝置改為檔案。標準函數庫裡頭很多東西的細節都相當複雜,知道怎麼用比較重要。