重新指派檔案指標。 提供更安全的函式版本;請參閱 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