fopen、fopen_s
From cppreference.com
| ヘッダー <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に書き込まれ、以下のエラーは実行時に検出され、現在インストールされている制約ハンドラ関数が呼び出されます。-
streamptrがヌルポインタである -
filenameがヌルポインタである -
modeがヌルポインタである
-
fopen_sが利用可能であることは、実装によって__STDC_LIB_EXT1__が定義され、かつユーザーが<stdio.h>をインクルードする前に__STDC_WANT_LIB_EXT1__を整数定数1として定義した場合にのみ保証されます。目次 |
[編集] Parameters
| filename | - | ファイルストリームを関連付けるファイル名 |
| モード | - | null終端の文字列で、ファイルアクセスモードを決定します。 |
| streamptr | - | 関数の結果(out-parameter)が格納されるポインタへのポインタ。 |
[編集] File access flags
| ファイルアクセス モード文字列 |
意味 | 説明 | ファイルが存在する場合のアクション 既に存在する場合 |
ファイルが存在する場合のアクション 存在しない場合 |
|---|---|---|---|---|
| "r" | read | 読み込み用にファイルを開く | 最初から読み込む | オープン失敗 |
| "w" | write | 書き込み用にファイルを作成する | 内容を破棄する | 新規作成する |
| "a" | append | ファイルに追記する | 末尾に書き込む | 新規作成する |
| "r+" | 拡張読み込み | 読み書き用にファイルを開く | 最初から読み込む | error |
| "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) | ||||
[編集] Return value
1) 成功した場合、新しいファイルストリームへのポインタを返します。ストリームは、
filenameが対話型デバイスを参照しない限り、完全にバッファリングされます。エラーの場合、ヌルポインタを返します。POSIXでは、この場合errnoが設定されることが要求されています。2) 成功した場合、ゼロを返し、新しいファイルストリームへのポインタが*streamptrに書き込まれます。エラーの場合、ゼロ以外のエラーコードを返し、*streamptrにヌルポインタを書き込みます(
streamptr自体がヌルポインタでない限り)。[編集] Notes
filenameの形式は実装定義であり、必ずしもファイルを参照するとは限りません(例:コンソールやファイルシステムAPIを通じてアクセス可能な他のデバイスである可能性があります)。それらをサポートするプラットフォームでは、filenameは絶対パスまたは相対パスのファイルシステムパスを含めることができます。
[編集] Example
このコードを実行
#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
[編集] References
- 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関数
[編集] See also
| ファイルを閉じる (関数) | |
| 出力ストリームを実際のファイルと同期させる (function) | |
| (C11) |
既存のストリームを別の名前で開く (関数) |
| C++ドキュメント fopen
| |