freopen, freopen_s
From cppreference.net
|
ヘッダーで定義
<stdio.h>
|
||
| (1) | ||
| (C99まで) | ||
| (C99以降) | ||
| (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関数
関連項目
|
(C11)
|
ファイルを開く
(関数) |
|
ファイルを閉じる
(関数) |
|
|
C++ documentation
for
freopen
|
|