freopen

freopen

freopen是被包含於C標準庫頭檔案<stdio.h>中的一個函式,用於重定向輸入輸出流。該函式可以在不改變代碼原貌的情況下改變輸入輸出環境,但使用時應當保證流是可靠的。

基本介紹

  • 外文名:freopen
  • 頭檔案:stdio.h
  • 類別:C標準庫函式
  • 功能::把一個存在檔案流指定到另一檔案
函式簡介,程式例,恢復檔案流,

函式簡介

函式名:freopen
函式,以指定模式重新指定到另一個檔案。模式用於指定新檔案的訪問方式。
頭檔案:stdio.h
C89函式聲明:
FILE *freopen( const char *filename, const char *mode, FILE *stream );
C99函式聲明:
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
形參說明:
filename:需要重定向到的檔案名稱或檔案路徑。
mode:代表檔案訪問許可權的字元串。例如,"r"表示“唯讀訪問”、"w"表示“只寫訪問”、"a"表示“追加寫入”。
stream:需要被重定向的檔案流。
返回值:如果成功,則返回該指向該輸出流的檔案指針,否則返回為NULL。

程式例

舉例1
#include<stdio.h>int main(){    /* redirect standard output to a file */    if(freopen("D:\\output.txt", "w", stdout) == NULL)        fprintf(stderr,"error redirecting stdout\n");    /* this output will go to a file */    printf("This will go into a file.\n");    /*close the standard output stream*/    fclose(stdout);    return 0;}
舉例2
如果上面的例子您沒看懂這個函式的用法的話,請看這個例子。這個例子實現了從stdout到一個文本檔案的重定向。即,把輸出到螢幕的文本輸出到一個文本檔案中。
#include<stdio.h>int main(){    int i;    if (freopen ("D:\\output.txt", "w", stdout) == NULL)        fprintf(stderr, "error redirecting stdout\n");    for (i = 0; i < 10; i++)        printf("%3d", i);    printf("\n");    fclose(stdout);    return 0;}
編譯運行一下,你會發現,十個數輸出到了D糟根目錄下文本檔案output.txt中。
舉例3
從檔案in.txt中讀入數據,計算加和輸出到out.txt中
#include<stdio.h>int main(){    int a, b;    freopen("in.txt","r",stdin);    /* 如果in.txt不在連線後的exe的目錄,需要指定路徑如D:\in.txt */    freopen("out.txt","w",stdout); /*同上*/    while (scanf("%d%d", &a, &b) != EOF)        printf("%d\n",a+b);    fclose(stdin);    fclose(stdout);    return 0;}

恢復檔案流

當標準輸出stdout被重定向到指定檔案後,如何把它重定向回原來“默認”的輸出設備(即顯示器)呢?
C標準庫的回覆是:不支持。沒有任何方法可以恢復原來的輸出流。
那是否存在依賴具體平台的實現呢?存在。
在作業系統中,命令行控制台(即鍵盤或者顯示器)被視為一個檔案,既然是檔案,那么就有“檔案名稱”。由於歷史原因,命令行控制台檔案在DOS作業系統和Windows作業系統中的檔案名稱為"CON",在其它的作業系統(例如Unix、Linux、Mac OS X、Android等等)中的檔案名稱為"/dev/tty"。
因此,在Windows中可以使用
freopen( "CON", "w", stdout );
其它作業系統中使用:
freopen( "/dev/tty", "w", stdout );
Windows代碼舉例
#include<stdio.h>#include<stdlib.h>int main(){    FILE *stream;    if ((stream = freopen("file.txt", "w", stdout)) == NULL)        exit(-1);    printf("this is stdout output\n");    stream = freopen("CON","w",stdout);    /*stdout是向程式的末尾的控制台重定向*/    printf("And now back to the console once again\n");    return 0;}
Linux代碼舉例
#include <stdio.h>#include <stdlib.h>int main(void){    FILE *stream;    if ((stream = freopen("file.txt", "w", stdout)) == NULL)        exit(-1);    printf("this is stdout output\n");    stream = freopen("/dev/tty","w",stdout);    /*stdout是向程式的末尾的控制台重定向*/    printf("And now back to the console once again\n");    return 0;}
警告:在使用上述方法在輸入輸出流間進行反覆的重定向時,極有可能導致流指針得到不被期待的結果,使輸入輸出發生異常,所以如果需要在檔案的輸入輸出和標準輸入輸出流之間進行切換,建議使用fopen或者是C++標準的ifstream及ofstream。

相關詞條

熱門詞條

聯絡我們