Share via


freopen_s, _wfreopen_s

關閉目前與 oldStream 相關聯的檔案,並將 重新指派 stream 給 所 fileName 指定的檔案。

這些版本的 freopen 具有 _wfreopen 安全性增強功能,如 CRT 中的安全性功能中所述

語法

errno_t freopen_s(
   FILE ** stream,
   const char * fileName,
   const char * mode,
   FILE* oldStream
);

errno_t _wfreopen_s(
   FILE ** stream,
   const wchar_t * fileName,
   const wchar_t * mode,
   FILE * oldStream
);

參數

stream
out 參數,會在函式傳回時指向重新開啟的資料流程。

fileName
要重新開啟之檔案的路徑。

mode
重新開啟資料流程的模式。

oldStream
要重新開啟的資料流程。 它已排清,且與它相關聯的任何檔案都已關閉。

傳回值

成功時為零;否則為錯誤碼。 如果發生錯誤,則原始檔案會關閉,而且除非 也是 ,否則 NULLstream 會寫入至 streamNULL

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

備註

freopen_s 式通常用來附加與 stdinstdout 相關聯的預先開啟資料流程,以及 stderr 附加至另一個檔案。

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

如果 、 、 或 有任何 pFile 、 或 streamNULLpath 空字串,則這些函式會叫用不正確參數處理常式,如參數驗證 中所述 modepath 如果允許繼續執行,這些函式會將 errno 設為 EINVAL,並傳回 EINVAL

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

泛型文字常式對應

TCHAR.H 常規 _UNICODE_MBCS 未定義 _MBCS 定義 _UNICODE 定義
_tfreopen_s freopen_s freopen_s _wfreopen_s

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

mode 存取權限
"r" 開啟以讀取。 如果檔案不存在或找不到,呼叫 freopen_s 就會失敗。
"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_s <stdio.h>
_wfreopen_s <stdio.h><wchar.h>

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

如需相容性詳細資訊,請參閱相容性

範例

// crt_freopen_s.c
// 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 )
{
   errno_t err;
   // Reassign "stderr" to "freopen.out":
   err = freopen_s( &stream, "freopen.out", "w", stderr );

   if( err != 0 )
      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'

另請參閱

Stream I/O
freopen, _wfreopen
fclose, _fcloseall
_fdopen, _wfdopen
_fileno
fopen, _wfopen
_open, _wopen
_setmode