名前空間
変種

freopen、freopen_s

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

目次

パラメータ

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

ファイルアクセスフラグ

ファイルアクセス
モード文字列
意味 説明 ファイルが存在する場合のアクション
既に存在する場合
ファイルが存在する場合のアクション
存在しない場合
"r" read 読み込み用にファイルを開く 最初から読み込む 開くのに失敗する
"w" write 書き込み用にファイルを作成する 内容を破棄する 新規作成する
"a" append ファイルに追記する 末尾に書き込む 新規作成する
"r+" 拡張読み込み 読み書き用にファイルを開く 最初から読み込む error
"w+" 拡張書き込み 読み書き用にファイルを作成する 内容を破棄する 新規作成する
"a+" 拡張追記 読み書き用にファイルを開く 末尾に書き込む 新規作成する
ファイルアクセスモードフラグ "b" は、オプションでファイルをバイナリモードで開くために指定できます。このフラグはPOSIXシステムでは効果がありませんが、Windowsでは改行文字('\n')とEOF文字('\x1A')の特別な処理を無効にします。
追記ファイルアクセスモードでは、ファイル位置指示子の現在の位置に関係なく、データはファイルの末尾に書き込まれます。
モードが上記リストのいずれかの文字列でない場合、動作は未定義です。一部の実装では、追加のサポートされているモードが定義されています(例:Windows)。
更新モード('+')では、入出力の両方が可能ですが、fflushfseekfsetposまたはrewindの呼び出しが介在しない限り、出力の後にすぐに入力を行うことはできません。また、入力操作でファイルの終端に遭遇しない限り、fseekfsetposまたはrewindの呼び出しが介在しない限り、入力の後にすぐに出力を行うことはできません。更新モードでは、テキストモードが指定されている場合でも、実装はバイナリモードを使用することが許可されています。
"w"または"w+"指定子に、オプションでファイルアクセスモードフラグ "x" を追加できます。このフラグは、ファイルが存在する場合に上書きするのではなく、関数を失敗させます。(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がnullポインタの場合、モードの変更をサポートせず、これをエラーとして扱います(ドキュメントを参照)。可能性のある回避策は、非標準関数である_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 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

関連項目

ファイルを開く
(関数) [編集]
ファイルを閉じる
(関数) [編集]
English 日本語 中文(简体) 中文(繁體)