fopen, fopen_s
From cppreference.net
|
ヘッダーで定義
<stdio.h>
|
||
| (1) | ||
|
FILE
*
fopen
(
const
char
*
filename,
const
char
*
mode
)
;
|
(C99まで) | |
|
FILE
*
fopen
(
const
char
*
restrict
filename,
const
char
*
restrict
mode
)
;
|
(C99から) | |
|
errno_t fopen_s
(
FILE
*
restrict
*
restrict
streamptr,
const
char
*
restrict
filename,
|
(2) | (C11から) |
1)
filename
で指定されたファイルを開き、そのファイルに関連付けられたファイルストリームへのポインタを返します。
mode
はファイルアクセスモードを決定するために使用されます。
2)
(1)
と同様であるが、ファイルストリームへのポインタが
streamptr
に書き込まれ、以下のエラーが実行時に検出され、現在インストールされている
constraint handler
関数が呼び出される点が異なる:
-
-
streamptrがヌルポインタである -
filenameがヌルポインタである -
modeがヌルポインタである
-
fopen_s
は、実装によって
__STDC_LIB_EXT1__
が定義されており、かつユーザーが
<stdio.h>
をインクルードする前に
__STDC_WANT_LIB_EXT1__
を整数定数
1
に定義している場合にのみ利用可能であることが保証される。
目次 |
パラメータ
| filename | - | ファイルストリームに関連付けるファイル名 |
| mode | - | ファイルアクセスモードを決定する ヌル終端文字列 |
| streamptr | - | 関数が結果を格納するポインタへのポインタ(出力パラメータ) |
ファイルアクセスフラグ
|
ファイルアクセス
モード文字列 |
意味 | 説明 | ファイルが既に存在する場合の動作 | ファイルが存在しない場合の動作 |
|---|---|---|---|---|
| "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)
成功した場合、新しいファイルストリームへのポインタを返します。ストリームは、
filename
が対話型デバイスを参照しない限り完全にバッファリングされます。エラー時には、ヌルポインタを返します。
POSIXでは
この場合に
errno
が設定されることを要求しています。
2)
成功時はゼロを返し、新しいファイルストリームへのポインタが
*
streamptr
に書き込まれる。エラー時は非ゼロのエラーコードを返し、
*
streamptr
にnullポインタを書き込む(ただし
streamptr
自体がnullポインタの場合を除く)。
注記
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
参考文献
- C17 standard (ISO/IEC 9899:2018):
-
- 7.21.5.3 The fopen function (p: 223-224)
-
- K.3.5.2.1 The fopen_s function (p: 428-429)
- C11 standard (ISO/IEC 9899:2011):
-
- 7.21.5.3 The fopen function (p: 305-306)
-
- K.3.5.2.1 The fopen_s function (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++ documentation
for
fopen
|
|