名前空間
変種
操作

freopen, freopen_s

提供: cppreference.com
< c‎ | io
 
 
ファイル入出力
関数
ファイルアクセス
freopenfreopen_s
(C11)
(C95)
直接入出力
書式なし入出力
(C11以前)(C11およびそれ以降)
(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 がヌルでなければ、 fopen によって行われたかのように、 mode を使用して filename で指定されたファイルを開くことを試み、そのファイルを stream の指すファイルストリームに紐付けます。 filename がヌルポインタの場合は、すでに stream に紐付けられているファイルを開き直すことを試みます (この場合にモード変更が可能かどうかは処理系定義です)。
2) (1) と同じですが、 modefopen_s でのように扱われ、ファイルストリームを指すポインタは newstreamptr に書き込まれ、以下のエラーが実行時に検出され、現在設定されている制約ハンドラ関数を呼びます。
  • newstreamptr がヌルポインタ。
  • stream がヌルポインタ。
  • mode がヌルポインタ。
すべての境界チェック付き関数と同様に、 freopen_s__STDC_LIB_EXT1__ が処理系によって定義されていて、 <stdio.h> をインクルードする前にユーザが __STDC_WANT_LIB_EXT1__ を整数定数 1 に定義した場合にのみ、利用可能であることが保証されます。


目次

[編集] 引数

filename - ファイルストリームを紐付けるファイル名
mode - 新しいファイルアクセスモードを決定するヌル終端文字列
ファイルアクセスモード文字列 意味 説明 ファイルがすでに存在する場合の動作 ファイルが存在しない場合の動作
"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" で作成されたあらゆるファイルに対して、他のユーザがアクセスできないようにファイルアクセスパーミッションが設定されます。 デフォルトの fopen のパーミッションを有効化するために、 "w" または "a" で始まる任意の指定子の前にファイルアクセスモードフラグ "u" を任意に指定できます。 (C11)
stream - 変更するファイルストリーム
newstreamptr - 結果を格納するポインタへのポインタ (出力引数)

[編集] 戻り値

1) 成功した場合は stream の値のコピー、失敗した場合はヌルポインタ。
2) 成功した場合はゼロ (また、 stream の値のコピーが *newstreamptr に書き込まれます)、エラーの場合は非ゼロ (また、 newstreamptr 自体がヌルポインタでなければ、ヌルポインタが *newstreamptr に書き込まれます)。

[編集] ノート

freopen は入出力操作または fwide によっていったん確立されたストリームのナロー/ワイド指向を変更する唯一の方法です。

[編集]

以下のコードは 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);
}

出力:

stdout is printed to console

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.21.5.4 The freopen function (p: 307)
  • K.3.5.2.2 The freopen_s function (p: 590)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.19.5.4 The freopen function (p: 272-273)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.9.5.4 The freopen function

[編集] 関連項目

ファイルを開きます
(関数) [edit]
ファイルを閉じます
(関数) [edit]