共用方式為


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 傳回指標值。 如果 pathmodestream 是 Null 指標,或 如果 filename 是空字串,則這些函式會叫用不正確參數處理常式,如參數驗證 中所述 。 如果允許繼續執行,這些函式會將 errno 設為 EINVAL,並傳回 NULL

如需錯誤碼的詳細資訊,請參閱 errno_doserrno_sys_errlist_sys_nerr

備註

這些函式有更安全的版本存在,請參閱 freopen_s_wfreopen_s

freopen 式會關閉目前與 stream 相關聯的檔案,並將 重新指派 stream 給 所 path 指定的檔案。 _wfreopen_freopen 的寬字元版本;_wfreopenpathmode 引數是寬字元字串。 否則,_wfreopen_freopen 的行為即會相同。

根據預設,此函式的全域狀態會限定于應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。

泛型文字常式對應

TCHAR.H 常規 _UNICODE_MBCS 未定義 _MBCS 定義 _UNICODE 定義
_tfreopen freopen freopen _wfreopen

freopen 通常用來將已預先開啟的檔案 stdinstdoutstderr 導向至使用者所指定的檔案。 與 stream 相關聯的新檔案會以 mode 開啟,這是一個字元字串,指定針對檔案要求的存取類型,如下所示:

mode 存取權限
"r" 開啟以讀取。 如果檔案不存在或找不到,呼叫 freopen 就會失敗。
"w" 開啟空白檔案以寫入。 如果指定的檔案已存在,其內容將被終結。
"a" 開啟以供在檔案結尾寫入 (附加),並且在將新資料寫入檔案之前,不會移除檔案結尾 (EOF) 標記。 如果該檔案不存在,則建立檔案。
"r+" 開啟以進行讀取和寫入。 檔案必須存在。
"w+" 開啟空白檔案以進行讀取和寫入。 如果檔案存在,其內容會遭到銷毀。
"a+" 開啟以進行讀取和附加。 附加作業包括在將新資料寫入檔案之前移除 EOF 標記。 寫入完成後,不會還原 EOF 標記。 如果該檔案不存在,則建立檔案。

請小心使用 "w""w+" 類型,因為它們可以終結現有的檔案。 從 C11 開始,您可以在 檔案存在時附加 "x""w+""w" 導致函式失敗,而不是覆寫它。

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

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

指定 "r+""w+""a+" 存取類型時,同時允許讀取和寫入 (表示檔案是要開啟以供「更新」之用)。 不過,當您在讀取和寫入之間切換時,必須有中間 fsetpos 的 、 fseekrewind 作業。 如果您想要的話,可以為 或 fseek 作業指定 fsetpos 目前的位置。 除了上面的值之外,可以將下列字元包含在 mode 字串中以指定新行的轉譯模式。

mode 改 性 劑 翻譯模式
t 以文字 (已轉譯) 模式開啟。
b 以二進位 (未轉譯) 模式開啟;隱藏涉及歸位字元和換行字元的翻譯。

在文字(翻譯)模式中,歸位字元換行字元 (CR-LF) 組合會在輸入時轉譯成單行摘要 (LF) 字元:LF 字元會轉譯為輸出上的 CR-LF 組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。 在為了讀取或以 "a+" 讀取和寫入而開啟的檔案中,該執行階段程式庫會盡可能檢查檔案結尾是否有 Ctrl+Z,並加以移除。 因為使用 fseekftell 在檔案內移動可能會導致 fseek 在檔案結尾處的行為不正確,所以會移除它。 如果您想要 ANSI 可攜性,請不要使用 t 選項,因為它是 Microsoft 擴充功能。

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

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

需求

函式 必要的標頭
freopen <stdio.h>
_wfreopen <stdio.h><wchar.h>

通用 Windows 平臺 (UWP) 應用程式中不支援主控台。 與主控台、 stdinstdoutstderr 相關聯的標準資料流程控制碼必須先重新導向,C 執行時間函式才能在 UWP 應用程式中使用這些控制碼。 如需相容性詳細資訊,請參閱相容性

範例

// 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" );
}
successfully reassigned
This will go to the file 'freopen.out'

另請參閱

資料流 I/O
fclose, _fcloseall
_fdopen, _wfdopen
_fileno
fopen, _wfopen
_open, _wopen
_setmode