名稱空間
變體
操作

freopen, freopen_s

來自 cppreference.com
< c‎ | io
 
 
檔案輸入/輸出
型別和物件
        
函式
檔案訪問
freopenfreopen_s
(C11)  
(C95)
非格式化輸入/輸出
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

格式化輸入
 
定義於標頭檔案 <stdio.h>
(1)
FILE *freopen( const char *filename, const char *mode,
               FILE *stream );
(直到 C99)
FILE *freopen( const char *restrict filename, const char *restrict mode,
               FILE *restrict stream );
(C99 起)
errno_t freopen_s( FILE *restrict *restrict newstreamptr,

                   const char *restrict filename, const char *restrict mode,

                   FILE *restrict stream );
(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)。
在更新模式 ('+') 下,可以執行輸入和輸出,但在輸出之後不能沒有呼叫 fflushfseekfsetposrewind 就進行輸入,並且在輸入之後不能沒有呼叫 fseekfsetposrewind 就進行輸出,除非輸入操作遇到檔案結束。在更新模式下,即使指定了文字模式,實現也允許使用二進位制模式。
檔案訪問模式標誌 "x" 可以選擇性地附加到 "w""w+" 說明符。此標誌強制函式在檔案存在時失敗,而不是覆蓋它。 (C11)
當使用 fopen_sfreopen_s 時,用 "w""a" 建立的任何檔案的檔案訪問許可權會阻止其他使用者訪問它。檔案訪問模式標誌 "u" 可以選擇性地前置到任何以 "w""a" 開頭的說明符,以啟用預設的 fopen 許可權。 (C11)

返回值

1) 成功時返回 stream 值的副本,失敗時返回空指標。
2) 成功時返回零(並將 stream 值的副本寫入 *newstreamptr),錯誤時返回非零(並將空指標寫入 *newstreamptr,除非 newstreamptr 本身是空指標)。

注意

一旦流的窄/寬方向透過 I/O 操作或 fwide 建立,freopen 是改變它的唯一方法。

Microsoft CRT 版本的 freopenfilename 為空指標時不支援任何模式更改,並將其視為錯誤(參見文件)。一個可能的解決方法是非標準函式 _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 函式

另請參閱

開啟檔案
(函式) [編輯]
關閉檔案
(函式) [編輯]
C++ 文件 關於 freopen