Namespaces
Variants

freopen, freopen_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <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 が null でない場合、 mode を使用して filename で指定されたファイルを fopen と同様にオープンし、そのファイルを stream が指すファイルストリームに関連付けます。 filename が null ポインタの場合、関数は既に stream に関連付けられているファイルの再オープンを試みます(この場合、どのモード変更が許可されるかは実装定義です)。
2) (1) と同様だが、 mode fopen_s と同様に扱われ、ファイルストリームへのポインタは newstreamptr に書き込まれ、以下のエラーが実行時に検出されて現在インストールされている 制約ハンドラ 関数を呼び出す:
  • newstreamptr がヌルポインタ
  • stream がヌルポインタ
  • mode がヌルポインタ
すべての境界チェック付き関数と同様に、 freopen_s は実装によって __STDC_LIB_EXT1__ が定義され、かつユーザーが <stdio.h> をインクルードする前に __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ利用可能であることが保証される。

目次

パラメータ

filename - ファイルストリームに関連付けるファイル名
mode - 新しい ファイルアクセスモード を決定するnull終端文字列
stream - 変更するファイルストリーム
newstreamptr - 関数が結果を格納するポインタへのポインタ(出力パラメータ)

ファイルアクセスフラグ

ファイルアクセス
モード文字列
意味 説明 ファイルが既に存在する場合の動作 ファイルが存在しない場合の動作
"r" read 読み取り用にファイルを開く 先頭から読み取り オープン失敗
"w" write 書き込み用にファイルを作成 内容を破棄 新規作成
"a" append ファイルに追記 末尾に書き込み 新規作成
"r+" read extended 読み書き用にファイルを開く 先頭から読み取り エラー
"w+" write extended 読み書き用にファイルを作成 内容を破棄 新規作成
"a+" append extended 読み書き用にファイルを開く 末尾に書き込み 新規作成
ファイルアクセスモードフラグ "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 の値のコピー、失敗時はnullポインタ。
2) 成功時はゼロ(かつ stream の値のコピーが * newstreamptr に書き込まれる)、エラー時は非ゼロ(かつ * newstreamptr にはnullポインタが書き込まれる。ただし newstreamptr 自体がnullポインタの場合は除く)。

注記

freopen は、ストリームのナロー/ワイド方向がI/O操作または fwide によって確立された後、その方向を変更する唯一の方法です。

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関数

関連項目

ファイルを開く
(関数)
ファイルを閉じる
(関数)