fopen, fopen_s
| ヘッダで定義 <stdio.h>
|
||
FILE* fopen( const char* filename, const char* mode );
|
(1) | (C99まで) |
FILE* fopen( const char* restrict filename, const char* restrict mode );
|
(C99以降) | |
errno_t fopen_s( FILE* restrict* restrict streamptr,
const char* restrict filename,
const char* restrict mode );
|
(2) | (C11以降) |
1)
filenameで示されるファイルを開き、そのファイルに関連付けられたファイルストリームへのポインタを返します。 mode はファイルアクセスモードを決定するために使用されます。2) (1)と同じですが、ファイルストリームへのポインタが
streamptr に書き込まれ、以下のエラーが実行時に検出され、現在インストールされている 制約ハンドラ 関数が呼び出される点が異なります:
streamptrがヌルポインタの場合filenameがヌルポインタの場合modeがヌルポインタの場合
fopen_s は、__STDC_LIB_EXT1__ が実装によって定義されており、ユーザーが __STDC_WANT_LIB_EXT1__ を整数定数 1 として定義してから <stdio.h> をインクルードした場合にのみ使用可能であることが保証されます。パラメータ
| filename | - | ファイルストリームに関連付けるファイル名 |
| mode | - | ファイルアクセスモードを決定するヌル終端文字列ファイルアクセスモード |
| streamptr | - | 関数が結果を格納するポインタへのポインタ(出力パラメータ) |
ファイルアクセスフラグ
| ファイルアクセス モード文字列 |
意味 | 説明 | ファイル が既に存在する場合の動作 |
ファイル が存在しない場合の動作 |
|---|---|---|---|---|
"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) 成功した場合、新しいファイルストリームへのポインタを返します。ストリームは、
filename が対話型デバイスを参照している場合を除き、完全にバッファリングされます。エラーの場合は、ヌルポインタを返します。 POSIXでは、 POSIXでは、この場合に errno が設定されることが要求されています。2) 成功した場合、ゼロを返し、新しいファイルストリームへのポインタが
*streamptr に書き込まれます。エラーの場合は、ゼロ以外のエラーコードを返し、*streamptr にヌルポインタを書き込みます(ただし、streamptr 自体がヌルポインタの場合は除く)。ノート
filename の形式は実装定義であり、必ずしもファイルを参照するとは限りません(例:コンソールやファイルシステムAPIを介してアクセス可能なその他のデバイスである可能性があります)。それらをサポートするプラットフォームでは、filename には絶対パスまたは相対パスのファイルシステムパスを含めることができます。
例
このコードを実行する
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const char* fname = "/tmp/unique_name.txt"; // or tmpnam(NULL);
int is_ok = EXIT_FAILURE;
FILE* fp = fopen(fname, "w+");
if (!fp)
{
perror("File opening failed");
return is_ok;
}
fputs("Hello, world!\n", fp);
rewind(fp);
int c; // note: int, not char, required to handle EOF
while ((c = fgetc(fp)) != EOF) // standard C I/O file reading loop
putchar(c);
if (ferror(fp))
puts("I/O error when reading");
else if (feof(fp))
{
puts("End of file is reached successfully");
is_ok = EXIT_SUCCESS;
}
fclose(fp);
remove(fname);
return is_ok;
}
出力例:
Hello, world!
End of file is reached successfully
参考文献
- C23 標準 (ISO/IEC 9899:2024):
- 7.21.5.3 fopen 関数 (p: TBD)
- K.3.5.2.1 fopen_s 関数 (p: TBD)
- C17 標準 (ISO/IEC 9899:2018):
- 7.21.5.3 fopen 関数 (p: 223-224)
- K.3.5.2.1 fopen_s 関数 (p: 428-429)
- C11 標準 (ISO/IEC 9899:2011):
- 7.21.5.3 fopen 関数 (p: 305-306)
- K.3.5.2.1 fopen_s 関数 (p: 588-590)
- C99 標準 (ISO/IEC 9899:1999):
- 7.19.5.3 fopen 関数 (p: 271-272)
- C89/C90 標準 (ISO/IEC 9899:1990):
- 4.9.5.3 fopen 関数
関連項目
| ファイルを閉じる (関数) | |
| 出力ストリームを実際のファイルと同期させる (関数) | |
(C11) |
既存のストリームを別の名前で開く (関数) |
C++ ドキュメント の fopen
| |