共用方式為


freopen、_wfreopen

重新指派檔案指標。 更多這些函式的可用安全版本,請參閱 freopen_s、_wfreopen_s

FILE *freopen( 
   const char *path,
   const char *mode,
   FILE *stream 
);
FILE *_wfreopen( 
   const wchar_t *path,
   const wchar_t *mode,
   FILE *stream 
);

參數

  • path
    新的檔案路徑。

  • mode
    允許存取的型別。

  • stream
    指向 FILE 結構的指標。

傳回值

每一個這些函式都會傳回最近開啟過的檔案的指標。 如果發生錯誤,原始檔案關閉和函式會傳回 NULL 指標值。 如果 path,mode或 是stream 是一個null指標,或者如果filename是個空字串,這些函數調用的參數無效處理程序,如以下描述參數驗證。 如果允許繼續執行,這些函式會將 errno 設定為 EINVAL 並傳回 NULL。

如需更多關於這些和其他回傳碼的資訊,請參閱 _doserrno 、 errno 、 _sys_errlist 和 _sys_nerr (_doserrno, errno, _sys_errlist, and _sys_nerr)

備註

這些函式更安全的版本,請參閱 freopen_s, _wfreopen_s

freopen 函式會關閉目前與 stream 相關聯的檔案 並重新指派 stream 到 path _wfreopen是一個寬字符版本_freopen ;path 和mode是參數_wfreopen 是寬字符字符串。 _wfreopen 和 _freopen 其餘行為相同。

一般文字常式對應

TCHAR.H 常式

未定義 _UNICODE & _MBCS

已定義 _MBCS

已定義 _UNICODE

_tfreopen

freopen

freopen

_wfreopen

freopen 通常用來將目前開啟的檔案 stdin、 stdout和 stderr 重新導向至使用者指定的檔案。 與 stream 相關聯的新檔案將與 mode 一起開啟,其是指定檔案要求的存取類型的字串,如下:

  • "r"
    開啟以讀取。 如果檔案不存在或找不到,freopen 呼叫就會失敗。

  • "w"
    開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。

  • "a"
    開啟以撰寫在檔案結束時 (附加),將新資料加入檔案之前沒有移除 EOF 標記;如果檔案不存在,則會先建立檔案。

  • "r+"
    開啟以進行讀取和寫入。(檔案必須存在。)

  • "w+"
    開啟空白檔案以進行讀取和寫入。 如果指定的檔案已存在,其內容將被終結。

  • "a+"
    開啟檔案以讀取和附加;附加作業包括在新資料寫入檔案之前移除 EOF 標記,且在寫入完成後還原 EOF 標記;如果檔案不存在則會先建立檔案。

請使用 "w" 和 "w+" 型別請注意,它們可以終結現有檔案。

使用 "a" 或 "a+" 存取類型開啟檔案時,所有寫入作業都會在檔案結尾進行。 雖然檔案指標可以使用 fseek 或 rewind 重新調整位置,但是在執行任何寫入作業之前,檔案指標永遠會移回至檔案結尾。 因此,無法覆寫現有資料。

在附加到檔案之前,"a" 模式不會移除 EOF 標記。 進行附加之後,MS-DOS TYPE 命令只顯示到原始 EOF 標記為止的資料,任何附加至檔案的資料都不會出現。 "a+" 模式會在附加到檔案之前移除 EOF 標記。 附加之後,MS-DOS TYPE 命令會顯示檔案中的所有資料。 附加至以 CTRL+Z EOF 標記終止的資料流檔案時,需要 "a+" 模式。

指定 "r+"、"w+" 或 "a+" 存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供「更新」之用)。 然而,當您在讀取和寫入之間切換時,必定會有干擾的 fsetposfseek回溯 作業。 如果需要,目前位置可以為 fsetpos 或 fseek 作業指定。 除了上述值之外,下列其中一個字元可能包含在 mode 字串,以為新行指定平移模式。

  • t
    以文字 (平移) 模式開啟;歸位字元與換行字元組合會在輸入時轉譯成單一換行字元,而換行字元會在輸出時轉譯成歸位字元與換行字元組合。 此外, CTRL+Z 將解譯成輸入的檔案結尾字元。 在開啟用來撰寫或讀取並且以 "a+" 讀取的檔案,執行階段程式庫檢查檔案結尾是否有 CTRL+Z,若有則移除它。 之所以這樣做,是因為使用 fseek 和 ftell 在以 CTRL+Z 結束的檔案內移動可能會讓 fseek 在檔案結尾附近產生不正確的行為。 t 選項為 Microsoft 擴充功能,不可在需要 ANSI 可攜性的時候使用。

  • b
    以二進位 (未轉譯的) 模式開啟;上述轉譯會隱藏。

如果 mode 中未指定 t 或 b,則預設轉譯模式由全域變數 _fmode 定義。 如果引數前置 t 或 b,則函式失敗並傳回 NULL。

如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O

需求

Function

必要的標頭

freopen

<stdio.h>

_wfreopen

<stdio.h> 或 <wchar.h>

Windows 市集 應用程式不支援主控台。 與主控台關聯的標準資料流控制代碼 (stdin、stdout 和 stderr) 必須重新導向,然後 C 執行階段函式才能在 Windows 市集 應用程式中使用它們。 如需其他相容性資訊,請參閱相容性

範例

// crt_freopen.c
// compile with: /W3
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
#include <stdio.h>
#include <stdlib.h>

FILE *stream;

int main( void )
{
   // Reassign "stderr" to "freopen.out": 
   stream = freopen( "freopen.out", "w", stderr ); // C4996
   // Note: freopen is deprecated; consider using freopen_s instead

   if( stream == NULL )
      fprintf( stdout, "error on freopen\n" );
   else
   {
      fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
      fprintf( stream, "This will go to the file 'freopen.out'\n" );
      fclose( stream );
   }
   system( "type freopen.out" );
}
  

.NET Framework 對等用法

請參閱

參考

資料流 I/O

fclose、_fcloseall

_fdopen、_wfdopen

_fileno

fopen、_wfopen

_open、_wopen

_setmode