Namespaces
Variants

freopen, freopen_s

ja.cppreference.net より
< c | io
 
 
ファイル入出力
型とオブジェクト
        
関数
ファイルアクセス
(C95)
書式なし入出力
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

書式付き入力
直接入出力
書式付き出力
ファイル位置決め
エラーハンドリング
ファイル操作
 
ヘッダ <stdio.h>
FILE* freopen( const char* filename, const char* mode,
               FILE* stream );
で定義 (1) (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 がヌルポインタでない場合、filename で指定されたファイルを、mode をあたかも fopen のように使用して開こうと試み、そのファイルを stream が指すファイルストリームに関連付けます。filename がヌルポインタの場合、関数はすでに stream に関連付けられているファイルを再度開こうと試みます(この場合、どのモード変更が許されるかは処理系定義です)。
2) (1) と同じですが、 が modefopen_s のよう扱われ、ファイルストリームへのポインタが に書き込まれる点、および以下のエラーが実行時に検出されて現在インストールされている newstreamptr制約ハンドラ 関数が呼ばれる点が異なります: はヌルポインタ
  • newstreamptr はヌルポインタ
  • stream はヌルポインタ
  • mode すべての境界チェック付き関数と同様、
は、処理系が freopen_s を定義しており、ユーザが __STDC_LIB_EXT1__ をインクルードする前に整数定数 __STDC_WANT_LIB_EXT1__ を定義する場合にのみ利用可能であることが保証されます。1stdio.h<.>目次

filename

- ファイルストリームに関連付けるファイル名 mode
- 新しい ファイルアクセスモード を決定するヌル終端文字列
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 自体がヌルポインタの場合は除く)。

ノート

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

参考文献

  • C23 規格 (ISO/IEC 9899:2024):
  • 7.21.5.4 The freopen function (p: TBD)
  • K.3.5.2.2 The freopen_s function (p: TBD)
  • C17 規格 (ISO/IEC 9899:2018):
  • 7.21.5.4 The freopen function (p: 224-225)
  • K.3.5.2.2 The freopen_s function (p: 429-430)
  • C11 規格 (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 規格 (ISO/IEC 9899:1999):
  • 7.19.5.4 The freopen function (p: 272-273)
  • C89/C90 規格 (ISO/IEC 9899:1990):
  • 4.9.5.4 The freopen function

関連項目

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