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
。
如需錯誤碼的詳細資訊,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。
備註
這些函式有更安全的版本存在,請參閱 freopen_s
、 _wfreopen_s
。
函 freopen
式會關閉目前與 stream
相關聯的檔案,並將 重新指派 stream
給 所 path
指定的檔案。 _wfreopen
是 _freopen
的寬字元版本;_wfreopen
的 path
和 mode
引數是寬字元字串。 否則,_wfreopen
和 _freopen
的行為即會相同。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
TCHAR.H 常式 |
_UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tfreopen |
freopen |
freopen |
_wfreopen |
freopen
通常用來將已預先開啟的檔案 stdin
、stdout
和 stderr
導向至使用者所指定的檔案。 與 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
的、 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 |
<stdio.h> |
_wfreopen |
<stdio.h> 或 <wchar.h> |
通用 Windows 平台 (UWP) 應用程式中不支援主控台。 與主控台 stdin
、stdout
和 stderr
相關聯的標準資料流控制代碼必須重新導向,之後 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