freopen, freopen_s
來自 cppreference.com
定義於標頭檔案 <stdio.h> |
||
(1) | ||
(直到 C99) | ||
(C99 起) | ||
(2) | (C11 起) | |
1) 首先,嘗試關閉與
stream
關聯的檔案,忽略任何錯誤。然後,如果 filename
不為空,則嘗試使用 mode
開啟由 filename
指定的檔案,如同使用 fopen,並將該檔案與由 stream
指向的檔案流關聯起來。如果 filename
是一個空指標,則函式嘗試重新開啟已與 stream
關聯的檔案(在這種情況下允許哪些模式更改是實現定義的)。2) 與 (1) 相同,除了
mode
的處理方式與 fopen_s 相同,並且檔案流的指標被寫入 newstreamptr
,並在執行時檢測到以下錯誤並呼叫當前已安裝的 約束處理程式 函式-
newstreamptr
是一個空指標 -
stream
是一個空指標 -
mode
是一個空指標
-
- 與所有邊界檢查函式一樣,只有當實現定義了 __STDC_LIB_EXT1__ 並且使用者在包含 <stdio.h> 之前將 __STDC_WANT_LIB_EXT1__ 定義為整數常量 1 時,才能保證 freopen_s 可用。
目錄 |
引數
filename | - | 要將檔案流關聯到的檔名 |
mode | - | 以 null 結尾的字串,確定新的檔案訪問模式 |
stream | - | 要修改的檔案流 |
newstreamptr | - | 指向一個指標的指標,函式將結果儲存在此處(一個輸出引數) |
檔案訪問標誌
檔案訪問 模式字串 |
含義 | 解釋 | 檔案 已存在時的操作 |
檔案 不存在時的操作 |
---|---|---|---|---|
"r" | 讀 | 開啟檔案進行讀取 | 從頭開始讀取 | 開啟失敗 |
"w" | 寫 | 建立檔案進行寫入 | 銷燬內容 | 建立新檔案 |
"a" | 追加 | 追加到檔案 | 寫入到末尾 | 建立新檔案 |
"r+" | 讀取擴充套件 | 開啟檔案進行讀/寫 | 從頭開始讀取 | 錯誤 |
"w+" | 寫入擴充套件 | 建立檔案進行讀/寫 | 銷燬內容 | 建立新檔案 |
"a+" | 追加擴充套件 | 開啟檔案進行讀/寫 | 寫入到末尾 | 建立新檔案 |
檔案訪問模式標誌 "b" 可選地指定為以二進位制模式開啟檔案。此標誌在 POSIX 系統上沒有影響,但在 Windows 上它會停用對 '\n' 和 '\x1A' 的特殊處理。 在追加檔案訪問模式下,無論檔案位置指示器的當前位置如何,資料都將寫入檔案末尾。 | ||||
如果模式不是上面列出的字串之一,則行為未定義。一些實現定義了額外的支援模式(例如 Windows)。 | ||||
在更新模式 ('+') 下,可以執行輸入和輸出,但在輸出之後不能沒有呼叫 fflush、fseek、fsetpos 或 rewind 就進行輸入,並且在輸入之後不能沒有呼叫 fseek、fsetpos 或 rewind 就進行輸出,除非輸入操作遇到檔案結束。在更新模式下,即使指定了文字模式,實現也允許使用二進位制模式。 | ||||
檔案訪問模式標誌 "x" 可以選擇性地附加到 "w" 或 "w+" 說明符。此標誌強制函式在檔案存在時失敗,而不是覆蓋它。 (C11) | ||||
當使用 fopen_s 或 freopen_s 時,用 "w" 或 "a" 建立的任何檔案的檔案訪問許可權會阻止其他使用者訪問它。檔案訪問模式標誌 "u" 可以選擇性地前置到任何以 "w" 或 "a" 開頭的說明符,以啟用預設的 fopen 許可權。 (C11) |
返回值
1) 成功時返回
stream
值的副本,失敗時返回空指標。2) 成功時返回零(並將
stream
值的副本寫入 *newstreamptr),錯誤時返回非零(並將空指標寫入 *newstreamptr,除非 newstreamptr
本身是空指標)。注意
一旦流的窄/寬方向透過 I/O 操作或 fwide 建立,freopen
是改變它的唯一方法。
Microsoft CRT 版本的 freopen
在 filename
為空指標時不支援任何模式更改,並將其視為錯誤(參見文件)。一個可能的解決方法是非標準函式 _setmode()
。
示例
以下程式碼將 stdout
重定向到檔案。
執行此程式碼
#include <stdio.h> #include <stdlib.h> int main(void) { puts("stdout is printed to console"); if (freopen("redir.txt", "w", stdout) == NULL) { perror("freopen() failed"); return EXIT_FAILURE; } puts("stdout is redirected to a file"); // this is written to redir.txt fclose(stdout); return EXIT_SUCCESS; }
輸出
stdout is printed to console
引用
- C17 標準 (ISO/IEC 9899:2018)
- 7.21.5.4 freopen 函式 (p: 224-225)
- K.3.5.2.2 freopen_s 函式 (p: 429-430)
- C11 標準 (ISO/IEC 9899:2011)
- 7.21.5.4 freopen 函式 (p: 307)
- K.3.5.2.2 freopen_s 函式 (p: 590)
- C99 標準 (ISO/IEC 9899:1999)
- 7.19.5.4 freopen 函式 (p: 272-273)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 4.9.5.4 freopen 函式
另請參閱
(C11) |
開啟檔案 (函式) |
關閉檔案 (函式) | |
C++ 文件 關於 freopen
|