fopen、_wfopen

更新 : 2010 年 5 月

ファイルを開きます。 これらの関数のセキュリティを強化したバージョンについては、「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」を参照してください。

解説

fopen関数によって指定されたファイルを開きますfilename。 _wfopen は fopen のワイド文字バージョンであり、_wfopen の引数はワイド文字列です。 それ以外では、_wfopen と fopen の動作は同じです。 だけを使用して_wfopen、ファイル ストリームで使用されるコード化文字セットに影響を与えません。

fopen実行の時点でファイル システムに無効なパスを受け入れる; fopenUNC パスを含むパス、コードを実行するシステムは、共有へのアクセスがある限り、マップされたネットワーク ドライブや実行時のドライブの割り当てを受け入れます。 パスを作成した場合fopen、ドライブ、パス、またはネットワーク共有の実行環境で利用できることを確認してください。

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

Unicode のサポート

fopenUnicode ファイルのストリームをサポートします。 Unicode ファイルを開くには、パスはccsに必要なエンコーディングを指定フラグfopenは次のとおり。

fopen(&fp, "newfile.txt", "rw, ccs=encoding");

encoding に指定できる値は、UNICODE、UTF-8、および UTF-16LE です。

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

注意

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

次の表のさまざまな使用モードccsフラグをfopenとバイト順マークのファイル。

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ファイルを次のように要求されたアクセスの種類を指定します。

  • "r"
    読み取り用に開きます。 ファイルが存在しない場合や見つからない場合、fopen 呼び出しは失敗します。

  • "w"
    書き込み用に空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。

  • "a"
    追加 (新しいデータがファイルに書き込まれる前に、ファイルの終端 (EOF) のマーカーを削除することがなく)、ファイルの末尾で書き込みを開きます。 それが存在しない場合は、ファイルを作成します。

  • "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の改行文字の変換モードを指定します。

  • t
    ファイルをテキスト (変換) モードで開きます。 このモードでは、CTRL キーを押しながら Z、EOF 文字を入力として解釈されます。 開かれているファイルを使用するには、読み書きの"a+"、fopenを CTRL + Z をファイルの末尾を確認し、削除可能な場合は削除します。 これを使用するために行われますfseekとftellに CTRL キーを押しながら Z を終了可能性がありますファイル内を移動するにはfseek動作が、ファイルの末尾近くに。

テキスト モードでは、復帰と改行の組み合わせを入力、1 つの改行に変換され、改行文字が出力に復帰と改行の組み合わせに変換されます。 Unicode のストリーム入出力関数が既定のテキスト モードで動作すると、入力元または出力先のストリームはマルチバイト文字のシーケンスと仮定されます。 このため、Unicode ストリーム入力関数はマルチバイト文字をワイド文字に変換し、mbtowc 関数を呼び出した場合と同様の効果を得ます。 同様の理由で、Unicode ストリーム出力関数は、wctomb 関数が呼び出されたかのように、ワイド文字をマルチバイト文字に変換します。

  • b
    ファイルをバイナリ (無変換) モードで開きます。キャリッジ リターンとライン フィードの変換は行われません。

t または b を mode に指定しないと、既定の変換モードは _fmode グローバル変数によって定義されます。 t または b を引数の先頭に指定すると、エラーが発生して NULL が返されます。

テキスト モードとバイナリ モードの Unicode とマルチバイト ストリーム i/o を使用する方法についてを参照してくださいテキスト モードとバイナリ モードのファイル入出力テキスト モードとバイナリ モードの Unicode ストリーム入出力

  • c
    関連付けられた filename のコミット フラグを有効にして、fflush または _flushall のいずれかが呼び出された場合に、ファイル バッファーの内容がディスクに直接書き込まれるようにします。

  • n
    関連付けられた filename のコミット フラグを "コミットなし" にリセットします。これは、既定の設定です。 プログラムを COMMODE.OBJ とリンクする場合は、グローバル コミット フラグもオーバーライドします。 プログラムを明示的に COMMODE.OBJ とリンクしない場合、グローバル コミット フラグの既定の設定は "コミットなし" です (「リンク オプション」を参照してください)。

  • N
    ファイルが子プロセスによって継承されないように指定します。

  • S
    キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。

  • R
    キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。

  • T
    ファイルを一時ファイルとして指定します。 可能な場合、ファイルはディスクにフラッシュされません。

  • D
    ファイルを一時ファイルとして指定します。 最後のファイル ポインターが閉じられると、ファイルは削除されます。

  • ccs=ENCODING
    このファイルに使用するコード化された文字セット (UTF-8、UTF-16LE、または UNICODE) を指定します。 何も指定しない場合は、ANSI エンコーディングが使用されます。

有効な文字をmodeで使用される文字列fopenと_fdopen対応oflagで使用される引数_open_sopenは次のとおり。

mode 文字列の文字

_open/_sopen に相当する oflag 値

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

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>

互換性の詳細についてを参照してください互換性

c、n、t、S、R、TとDmodeオプションは Microsoft 拡張機能のfopenと_fdopenと ANSI の移植性が必要な使用する必要があります。

使用例

次のプログラムでは、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 );
}
  

次のプログラム ファイルを作成または、存在する場合上書き、テキスト モードでは、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;
}

同等の .NET Framework 関数

参照

参照

ストリーム入出力

マルチバイト文字のシーケンスの解釈

fclose、_fcloseall

_fdopen、_wfdopen

ferror

_fileno

freopen、_wfreopen

_open、_wopen

_setmode

_sopen、_wsopen

履歴の変更

日付

History

理由

2010 年 5 月

定義が更新a+。

コンテンツ バグ修正

2010 年 9 月

読み取りと書き込みの間の遷移を明らかにしました。

情報の拡充