fopen, _wfopen

ファイルを開きます。 追加のパラメーター検証を実行し、エラー コードを返す、より安全なバージョンのこれらの関数を使用できます。「」 fopen_s を参照 _wfopen_s してください。

構文

FILE *fopen(
   const char *filename,
   const char *mode
);
FILE *_wfopen(
   const wchar_t *filename,
   const wchar_t *mode
);

パラメーター

filename
ファイル名。

mode
有効なアクセス種類。

戻り値

これらの各関数は、開いているファイルへのポインターを返します。 エラーが発生すると、NULL のポインター値を返します。 filename または mode が NULL または空の文字列の場合、これらの関数は無効なパラメーター ハンドラーをトリガーします。これは、「パラメーターの検証」 で説明されています。 実行の継続が許可されている場合、これらの関数は NULL を 返し 、errno を EINVAL に設定します

詳細については、「、、 errno および _doserrno_sys_errlist_sys_nerr 参照してください

Remarks

関数 fopen は、ファイル名 で指定されたファイルを開 きます。 既定では、狭い ファイル名 の文字列は ANSI コード ページ ( ) を使用して解釈されます CP_ACP 。 このWindowsデスクトップ アプリケーションでは、 関数を使用して OEM コードページ ( CP_OEMCP ) に変更 SetFileApisToOEM できます。 関数を使用して、ANSI またはシステムの既定の OEM コード ページを使用してファイル名を解釈 AreFileApisANSI するかどうかを判断できます。 _wfopen は のワイド文字バージョンです fopen 。 の引数 _wfopen はワイド文字列です。 それ以外の場合、 _wfopenfopen は同じように動作します。 を使用 _wfopen しても、ファイル ストリームで使用されるコード化された文字セットには影響を与え "されません"。

fopen は、実行時点でファイル システムで有効なパスを受け入れる。は、コードを実行するシステムが実行時に共有ドライブまたはマップされたドライブにアクセスできる限り、マップされたネットワーク ドライブを含む UNC パスとパス fopen を受け入れる。 のパスを作成する場合は、実行環境でドライブ、パス、またはネットワーク共有 fopen を使用できます。 ディレクトリのパス区切り記号としてスラッシュ (/) または円記号 (\) のどちらかを使用できます。

ファイルでその他の操作を実行する前には、必ず戻り値をチェックしてポインターが NULL かどうかを確認します。 エラーが発生した場合は、グローバル変数 errno が設定され、特定のエラー情報を取得するために使用される可能性があります。 詳細については、「、、 errno および _doserrno_sys_errlist_sys_nerr 参照してください

既定では、この関数のグローバル状態はアプリケーションのスコープになります。 これを変更するには 、「CRT のグローバル状態」を参照してください

Unicode のサポート

fopen では、Unicode ファイル ストリームがサポートされています。 Unicode ファイルを開く場合は、次のように、目的のエンコードを指定する ccs フラグを fopen に渡します。

FILE * fp = fopen("newfile.txt", "rt+, ccs=encoding");

エンコードに使用できる 値は**、UNICODE、UTF-8、**および UTF-16LE です

ファイルが Unicode モードで開いている場合、入力関数は、ファイルから読み取ったデータを 型として格納された UTF-16 データに変換します wchar_t 。 Unicode モードで開いたファイルに書き込む関数では、 型として格納された UTF-16 データを含むバッファーが必要です wchar_t 。 ファイルが UTF-8 としてエンコードされている場合、UTF-16 データは書き込まれるときに UTF-8 に変換され、ファイルの UTF-8 でエンコードされた内容は読み取られるときに UTF-16 に変換されます。 Unicode モードで奇数バイトの読み取りまたは書き込みを試みると、 パラメーター検証 エラーが発生します。 UTF-8 としてプログラムに格納されたデータを読み取るか書き込む場合は、Unicode モードではなくテキストまたはバイナリ ファイル モードを使用します。 必要なエンコード変換は各自が行う必要があります。

既に存在するファイルを読み取り用または追加用に開く場合は、ファイル内にバイト順マーク (BOM: Byte Order Mark) があれば、それによってエンコーディングが決定されます。 BOM エンコードは 、ccs フラグで指定されたエンコードよりも優先されます。 ccs エンコードは、BOM が存在しない場合、またはファイルが新しいファイルである場合にのみ使用されます。

注意

BOM 検出は、Unicode モードで開かれたファイル ( つまり、ccs フラグを渡して) にのみ適用されます。

次の表は、ファイル内の fopen および Byte Order Marks に指定されるさまざまな ccs フラグに使用されるモードをまとめたものです。

ccs フラグおよび BOM に基づいて使用されるエンコーディング

ccs フラグ BOM なし (または新しいファイル) BOM: UTF-8 BOM: UTF-16
UNICODE UTF-16LE UTF-8 UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-16LE
UTF-16LE UTF-16LE UTF-8 UTF-16LE

Unicode モードで書き込むように開かれたファイルには、自動的に BOM が書き込まれます。

mode a, ccs=encoding の場合、最初に読み取りアクセスと書き込みアクセスの両方を使用してファイル fopen を開きます。 成功すると、この関数は BOM を読み取ってファイルのエンコーディングを決定します。失敗した場合は、ファイルに対して既定のエンコーディングを使用します。 どちらの場合も、 fopen は書き込み専用アクセスを使用してファイルを再び開きます。 (これは "a" モードにのみ適用 されます。"a+" モード には適用 されません)。

汎用テキスト ルーチンのマップ

TCHAR.H のルーチン _UNICODE および _MBCS が未定義の場合 _MBCS が定義されている場合 _UNICODE が定義されている場合
_tfopen fopen fopen _wfopen

文字列モード では、 ファイルに対して要求されるアクセスの種類を次のように指定します。

mode Access
"r" 読み取り用に開きます。 ファイルが存在しない場合、またはファイルが見つからない場合、呼び出 fopen しは失敗します。
"w" 書き込み用に空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。
"a" 末尾に書き込みができるようにファイルを開きます (追加モード)。EOF (end-of-file) マーカーを削除せずにファイルに新しいデータを書き込みます。 ファイルが存在しない場合は、作成します。
"r+" 読み取りと書き込みの両方のモードで開きます。 ファイルが存在している必要があります。
"w+" 読み取りと書き込みの両方のモードで空のファイルを開きます。 そのファイルが既に存在すると、そのファイルの内容は破棄されます。
"a+" 読み取りと追加の両方のモードでファイルを開きます。 追加操作には、新しいデータをファイルに書き込む前に EOF マーカーを削除することが含まれます。 書き込みの完了後に、EOF マーカーは復元されません。 ファイルが存在しない場合は、作成します。

"a" アクセスの種類または "a+" アクセスの種類を使用してファイルを開いた場合、すべての書き込み操作はファイルの末尾で行われます。 または を使用してファイル ポインターの位置を変更できますが、書き込み操作が実行される前に常にファイルの末尾 fseek rewind に戻されます。 したがって、既存のデータは上書きされません。

"a" モード では、EOF マーカーがファイルに追加される前に削除されません。 追加が行われても、MS-DOS TYPE コマンドでは元の EOF マーカーまでのデータしか表示されず、ファイルに追加されたデータは表示されません。 ファイルに追加する前に 、"a+" モードでは EOF マーカーが削除されます。 追加が終了すると、MS-DOS の TYPE コマンドでファイル内すべてのデータが表示されます。 Ctrl + Z EOF マーカーで終了するストリーム ファイルに追加するには 、"a+" モードが必要です。

"r+" 、"w+"、または "a+" アクセスの種類を指定すると、読み取りと書き込みの両方が有効になります (ファイルは "更新" 用に開いていると言います)。 ただし、読み取りから書き込みに切り替えると、入力操作は EOF マーカーを検出する必要があります。 EOF がない場合、ファイル ポジショニング関数の中間の呼び出しを使用する必要があります。 ファイル配置関数は fsetpos fseek 、、、および です rewind 。 書き込みから読み取りに切り替える場合は、 または ファイル配置関数への間の呼び出 fflush しを使用する必要があります。

前の値に加えて、次の文字を mode に追加して、改行文字の変換モードを指定できます。

mode 修飾子 翻訳モード
t ファイルをテキスト (変換) モードで開きます。
b バイナリ (非変換) モードで開く。復帰文字と改行文字を含む変換は抑制されます。

テキスト モードでは、Ctrl + Z は入力時に EOF 文字として解釈されます。 "a+" を使用して読み取り/書き込み用に開かれたファイルでは 、fopen はファイルの末尾で Ctrl + Z をチェックし、可能な場合は削除します。 これは、 と ftell を使用して Ctrl + Z で終わるファイル内を移動すると、ファイルの末尾付近で誤って動作する可能性があるという理由で fseek fseek 行われます。

テキスト モードでは、キャリッジ リターンライン フィードの組み合わせは入力時に 1 つの改行に変換され、ライン フィード文字は出力時にキャリッジ リターンライン フィードの組み合わせに変換されます。 Unicode のストリーム入出力関数が既定のテキスト モードで動作すると、入力元または出力先のストリームはマルチバイト文字のシーケンスと仮定されます。 したがって、Unicode ストリーム入力関数は、マルチバイト文字をワイド文字に変換します (関数の呼び出しの場合と同様 mbtowc )。 同じ理由から、Unicode ストリーム出力関数はワイド文字をマルチバイト文字に変換します (関数の呼び出しの場合と同様 wctomb )。

t または b が モードで 指定されていない 場合、既定の変換モードはグローバル変数 によって定義されます _fmodet または b が 引数 のプレフィックスである場合、関数は失敗し 、NULL を返します。

Unicode およびマルチバイトのストリーム入出力でテキスト モードとバイナリ モードを使用する方法について詳しくは、「 Text and Binary Mode File I/O 」および「 Unicode Stream I/O in Text and Binary Modes」をご覧ください。

次のオプションをモードに 追加して、 追加の動作を指定できます。

mode 修飾子 動作
x filename が既に存在する場合は、 関数を強制的に 失敗します。 "w" または "w+" 指定子でのみ使用できます。
c または が呼び出された場合にファイル バッファーの内容がディスクに直接書き込まれるように、関連付けられているファイル名のコミット フラグ fflush _flushall を有効にしてください。
n 関連付けられているファイル名のコミット フラグ "コミットなし" にリセットします。 既定値です。 プログラムを COMMODE.OBJ とリンクする場合は、グローバル コミット フラグもオーバーライドします。 プログラムを明示的に COMMODE.OBJ とリンクしない場合、グローバル コミット フラグの既定の設定は "コミットなし" です (「 Link Options」をご覧ください)。
N ファイルが子プロセスによって継承されないように指定します。
S キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。
R キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。
T ファイルを一時ファイルとして指定します。 可能な場合、ファイルはディスクにフラッシュされません。
D ファイルを一時ファイルとして指定します。 最後のファイル ポインターが閉じられると、ファイルは削除されます。
ccs=エンコード このファイルに使用するエンコードされた文字セット (UTF-8、UTF-16LE、 または UNICODE) を指定します。 何も指定しない場合は、ANSI エンコーディングが使用されます。

で使用され 、 および で使用される oflag 引数に対応するモード文字列の有効な文字。次 fopen _fdopen _open _sopen に示します。

モード文字列 文字 _ open/sopen の同等の値 _
A _ O _ WRONLY | _ O _ APPEND (通常 _ は O _ WRONLY | _ O _ CREAT | _ O _ APPEND)
a+ _ O _ RDWR | _ O _ APPEND (通常 _ は O _ RDWR | _ O _ APPEND | _ O _ CREAT )
r _O _ RDONLY
r+ _O _ RDWR
w _ O _ WRONLY (通常 _ は O _ WRONLY | _ O _ CREAT | _ O _ TRUNC)
w+ _ O _ RDWR (通常 _ は O _ RDWR | _ O _ CREAT | _ O _ TRUNC)
b _O _ BINARY
t _O _ TEXT
x _O _ EXCL
c なし
n なし
S _O _ SEQUENTIAL
R _O _ RANDOM
T _O _ SHORTLIVED
D _O _ TEMPORARY
ccs=UNICODE _O _ WTEXT
ccs=UTF-8 _O _ UTF8
ccs=UTF-16LE _O _ UTF16

rb モードを使用している場合は、コードを移植する必要はありません。また、大きなファイルのほとんどを読み取る必要がある場合、またはネットワークパフォーマンスを気にしない場合は、オプションとしてメモリ マップされた Win32 ファイルを使用するかどうかを検討することもできます。

必要条件

機能 必須ヘッダー
fopen <stdio.h>
_wfopen <stdio.h> または <wchar.h>

_wfopen は Microsoft 拡張機能です。 互換性の詳細については、「 互換性」を参照してください。

CntSRt、および D モード のオプションは、およびの Microsoft 拡張機能であり、ANSI の fopen _fdopen 移植性が必要な場合は使用しないでください。

例 1

次のプログラムは 2 ファイルを開きます。 を使用して fclose 最初のファイルを閉じ、 _fcloseall 残りのすべてのファイルを閉じます。

// crt_fopen.c
// compile with: /W3
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

   // Close stream if it is not NULL
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closed\n" );
      }
   }

   // All other files are closed:
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

例 2

次のプログラムでは、Unicode エンコーディングのテキスト モードで、ファイルを作成します (ファイルが存在する場合は上書きします)。 その後、2 つの文字列をファイルに書き込み、ファイルを閉じます。 出力は _wfopen_test.xml という名前のファイルで、出力セクションのデータが含まれています。

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
    wchar_t str[BUFFER_SIZE];
    size_t  strSize;
    FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

関連項目

ストリーム入出力
Multibyte-Character シーケンスの解釈
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen