Namespaces
Variants

fopen, fopen_s

From cppreference.net
< c ‎ | io
ヘッダーで定義 <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,

const char * restrict mode ) ;
(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関数

関連項目

ファイルを閉じる
(関数)
出力ストリームを実際のファイルと同期する
(関数)
既存のストリームを別の名前で開く
(関数)