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
要重新開啟的數據流。 它已排清,且與它相關聯的任何檔案都已關閉。
傳回值
成功時為零;否則為錯誤碼。 如果發生錯誤,則源檔會關閉,而且除非 也是 ,否則NULL
stream
會寫入至stream
NULL
如需錯誤碼的詳細資訊,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
備註
函freopen_s
式通常用來附加與 stdin
stdout
相關聯的預先開啟數據流,以及stderr
附加至另一個檔案。
函 freopen_s
式會關閉目前與 stream
相關聯的檔案,並將 重新指派 stream
給 所 path
指定的檔案。 _wfreopen_s
是 freopen_s
的寬字元版本;_wfreopen_s
的 path
和 mode
引數是寬字元字串。 否則,_wfreopen_s
和 freopen_s
的行為即會相同。
如果、 或有任何pFile
、 或 stream
是 NULL
path
空字串,則這些函式會叫用無效的參數處理程式,如參數驗證中所述。 mode
path
如果允許繼續執行,這些函式會將 errno
設為 EINVAL
,並傳回 EINVAL
。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
TCHAR.H 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s
通常用來將已預先開啟的檔案 stdin
、stdout
和 stderr
導向至使用者所指定的檔案。 與 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
的、 fseek
或 rewind
作業。 如果您想要的話,可以為 或 fseek
作業指定fsetpos
目前的位置。 除了上面的值之外,可以將下列字元包含在 mode
字串中以指定新行的轉譯模式。
mode 修飾元 |
翻譯模式 |
---|---|
t |
以文字 (已轉譯) 模式開啟。 |
b |
以二進位 (未轉譯) 模式開啟;隱藏涉及歸位字元和換行字元的翻譯。 |
在文字(翻譯)模式中,歸位字元換行字元 (CR-LF) 組合會在輸入時轉譯成單行摘要 (LF) 字元:LF 字元會轉譯為輸出上的CR-LF組合。 此外,Ctrl+Z 會在輸入中解譯成檔案結尾字元。 在為了讀取或以 "a+"
讀取和寫入而開啟的檔案中,該執行階段程式庫會盡可能檢查檔案結尾是否有 Ctrl+Z,並加以移除。 因為使用 fseek
和 ftell
在檔案內移動可能會導致 fseek
在檔案結尾處的行為不正確,所以會移除它。 當您想要 ANSI 可移植性時,請勿使用 t
選項,因為它是Microsoft擴充功能。
如果 t
或 b
未在 中 mode
指定 ,則預設轉譯模式是由全域變數 _fmode
所定義。 如果引數前置 t
或 b
,則函式失敗並傳回 NULL
。
如需文字和二進位模式的討論,請參閱 文字和二進位模式檔案 I/O。
需求
函式 | 必要的標頭 |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> 或 <wchar.h> |
通用 Windows 平台 (UWP) 應用程式中不支援主控台。 與主控台 stdin
、stdout
和 stderr
相關聯的標準資料流控制代碼必須重新導向,之後 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