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」を参照してください。
解説
fopen 関数は filenameで指定されたファイルを開きます。_wfopen は fopen のワイド文字バージョンであり、_wfopen の引数はワイド文字列です。それ以外では、_wfopen と fopen の動作は同じです。、_wfopen を使用して、ファイル ストリームで使用されるコード化文字セットには影響しません。
fopen は、実行時にファイル システムで有効なパスを受け取ります。; fopen が実行するシステムが実行時にコード共有にアクセスしたり、マップされたドライブがある限り割り当てられたネットワーク ドライブを含むパスと UNC パスを受け入れます。fopenのパスを構築するときに、ドライブ、パス、またはネットワーク共有が実行環境で使用できることを確認します。でディレクトリのパス区切り記号としてスラッシュ (/) または円記号 (\) を使用できます。
ファイルでそのほかの操作を実行する前に、ポインターが null であるかどうかを必ず戻り値をチェックします。エラーが発生した特定のエラー情報を取得するために、グローバル変数が設定され、errno 使用される場合があります。詳細については、「errno、_doserrno、_sys_errlist、および _sys_nerr」を参照してください。
Unicode のサポート
fopen のサポートの Unicode のファイル ストリーム。Unicode ファイルを開くには、fopenに目的のエンコーディングを指定するフラグの ccs を次のように渡します。
fopen(&fp, "newfile.txt", "rw, ccs=encoding");
encoding に指定できる値は、UNICODE、UTF-8、および UTF-16LE です。
ファイルが読み取りまたは追加の両方に既に存在し、読み取り用、バイト順マーク (BOM)、ファイルの現在、エンコーディングを決定します。BOM エンコーディングは ccs のフラグで指定されたエンコーディングよりも優先されます。ccs エンコーディングは、BOM がまたはファイルを新しいファイルである場合にのみ使用されます。
[!メモ]
BOM 付きの検出は、Unicode モードで開かれたファイルにのみ適用されます (つまり、ccs のフラグを渡して)。
次の表は、ファイルに fopen のバイト順マークに指定 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 は、ファイルに要求するアクセスの種類を次のように指定します。
"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 は、入力のモードで文字として解釈されます。/書き込み用に "a+"、ファイル、および削除の末尾に Ctrl + Z の fopen のチェックを使用して読み取ることで開いたファイルでは、可能であれば。これは fseek と ftell を使用すると、CTRL+Z で終わるファイル内で実行されるのに fseek はファイルの末尾付近で正しくされることがあるためです。
テキスト モードでは、復帰 return–linefeed 組み合わせは入力時に一つの改行に変換され、改行文字が出力のキャリッジ return–linefeed 組み合わせに変換されます。Unicode のストリーム入出力関数が既定のテキスト モードで動作すると、入力元または出力先のストリームはマルチバイト文字のシーケンスと仮定されます。このため、Unicode ストリーム入力関数はマルチバイト文字をワイド文字に変換し、mbtowc 関数を呼び出した場合と同様の効果を得ます。同様の理由で、Unicode ストリーム出力関数は、wctomb 関数が呼び出されたかのように、ワイド文字をマルチバイト文字に変換します。
- b
ファイルをバイナリ (無変換) モードで開きます。キャリッジ リターンとライン フィードの変換は行われません。
t または b を mode に指定しないと、既定の変換モードは _fmode グローバル変数によって定義されます。t または b を引数の先頭に指定すると、エラーが発生して NULL が返されます。
Unicode とマルチバイトのストリーム入出力のテキストと binary モードを使用する方法の詳細については、テキスト モードとバイナリ モードのファイル入出力、テキスト モードとバイナリ モードの 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 によってが _open と _sopenで使用され、oflag の引数は、次のように対応します。
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 マップト ファイルを検討する必要があります。
必要条件
Function |
必須ヘッダー |
---|---|
fopen |
<stdio.h> |
_wfopen |
<stdio.h> または <wchar.h> |
互換性に関する詳細については、互換性を参照してください。
ANSI 互換が必要な場合 c、n、t、S、R、Tと Dmode のオプションは fopen と _fdopen の Microsoft 拡張機能で使用しないでください。
使用例
次のプログラムは 2 ファイルを開きます。これにより、最初の残りのすべてのファイルを閉じますするファイルや _fcloseall を閉じるに fclose を使用します。
// 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 エンコーディングのテキスト モードにファイル (1)、またはオーバーライドを作成します。これは、ファイルと 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 関数
System::IO::FileStream::FileStream