freopen、freopen_s
From cppreference.com
| ヘッダー <stdio.h> で定義 |
||
| (1) | ||
| (C99まで) | ||
| (C99以降) | ||
| (2) | (C11 以降) | |
1) まず、
streamに関連付けられたファイルを、エラーを無視して閉じることを試みます。次に、filenameがnullでない場合、fopenによるようにmodeを使用して指定されたファイルを開こうとし、そのファイルをstreamが指すファイルストリームに関連付けます。filenameがnullポインタの場合、関数は既にstreamに関連付けられているファイルを再オープンしようとします(この場合、どのモードの変更が許可されるかは実装定義です)。2) (1) と同じですが、
modeはfopen_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)。 | ||||
| 更新モード('+')では、入出力の両方が可能ですが、fflush、fseek、fsetposまたはrewindの呼び出しが介在しない限り、出力の後にすぐに入力を行うことはできません。また、入力操作でファイルの終端に遭遇しない限り、fseek、fsetposまたは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
関連項目
| (C11) |
ファイルを開く (関数) |
| ファイルを閉じる (関数) | |
| C++ ドキュメント for freopen
| |