fopen_s
, _wfopen_s
ファイルを開きます。 これらのバージョンでは、「_wfopen
CRT のfopen
セキュリティ機能」で説明されているように、セキュリティが強化されています。
構文
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
errno_t _wfopen_s(
FILE** pFile,
const wchar_t *filename,
const wchar_t *mode
);
パラメーター
pFile
開いているファイルへのポインターを受け取るファイル ポインターへのポインター。
filename
開くファイルの名前。
mode
アクセス許可の種類。
戻り値
正常終了した場合は 0 を返します。失敗した場合はエラー コードを返します。 これらのエラー コードについて詳しくは、「errno
、_doserrno
、_sys_errlist
、および _sys_nerr
」を参照してください。
エラー条件
pFile |
filename |
mode |
戻り値 | pFile の内容 |
---|---|---|---|---|
NULL |
any | any | EINVAL |
変更なし |
any | NULL |
any | EINVAL |
変更なし |
any | any | NULL |
EINVAL |
変更なし |
解説
関数と_wfopen_s
関数はfopen_s
、共有用のファイルを開くできません。 ファイルを共有する必要がある場合は、適切な共有モード定数 (たとえば、読み取り/書き込み共有に使用) を使用_SH_DENYNO
します_wfsopen
。_fsopen
関数によって fopen_s
指定された filename
ファイルが開きます。 _wfopen_s
はワイド文字バージョン fopen_s
であり、引数 _wfopen_s
はワイド文字列です。 _wfopen_s
それ以外の fopen_s
場合は同じように動作します。
fopen_s
は、実行時にファイル システムで有効なパスを受け取ります。UNC パス、および割り当てられたネットワーク ドライブを含むパスは、コードを実行するシステムが実行時に共有ネットワーク ドライブまたは割り当てられたネットワーク ドライブにアクセスする限り、fopen_s
で受け取られます。 fopen_s
のパスを構築する場合は、実行時環境で使用できるドライブ、パス、またはネットワーク共有に関して推測を使用しないでください。 パスのディレクトリ区切り記号として、スラッシュ (/) または円記号 (\) を使用できます。
これらの関数では、パラメーターの検証が行われます。 または mode
filename
null ポインターの場合pFile
、「パラメーターの検証」で説明されているように、これらの関数は無効なパラメーター例外を生成します。
ファイルでその他の操作を実行する前には、必ず戻り値をチェックして関数が成功したかどうかを確認します。 エラーが発生した場合は、エラー コードが返され、グローバル変数 errno
が設定されます。 詳細については、「errno
」、「_doserrno
」、「_sys_errlist
」、および「_sys_nerr
」を参照してください。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 これを変更するには、「CRT でのグローバル状態」を参照してください。
Unicode のサポート
fopen_s
は Unicode のファイル ストリームをサポートします。 新規または既存の Unicode ファイルを開くには、目的の ccs
エンコードを指定するフラグを fopen_s
渡します。次に例を示します。
fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");
フラグの ccs
使用可能な値は UNICODE
、 UTF-8
、、および UTF-16LE
です。 値が指定 ccs
されていない場合は、 fopen_s
ANSI エンコードを使用します。
ファイルが既に存在し、読み取りまたは追加のために開かれている場合は、ファイルにバイト オーダー マーク (BOM) が存在する場合、エンコードが決定されます。 BOM エンコーディングは、ccs
フラグで指定されたエンコーディングよりも優先されます。 ccs
エンコーディングは、BOM が表示されていない場合またはファイルが新しいファイルの場合にのみ使用されます。
Note
BOM 検出は、Unicode モードで (つまり、ccs
フラグを渡して) 開かれたファイルにのみ適用されます。
次の表は、ファイル内の BOM に対してfopen_s
指定されるさまざまなccs
フラグ値のモードをまとめたものです。
フラグと BOM に ccs
基づいて使用されるエンコード
ccs フラグ |
BOM なし (または新しいファイル) | BOM: UTF-8 | BOM: UTF-16 |
---|---|---|---|
UNICODE |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-8 |
UTF-8 |
UTF-8 |
UTF-16LE |
UTF-16LE |
UTF-16LE |
UTF-8 |
UTF-16LE |
Unicode モードで書き込むように開かれたファイルには、自動的に BOM が書き込まれます。
(または"a, ccs=UTF-16LE"
) の場合mode
は"a, ccs=UNICODE"
"a, ccs=UTF-8"
、fopen_s
最初に読み取りアクセスと書き込みアクセスの両方でファイルを開こうとします。 成功すると、この関数は BOM を読み取ってファイルのエンコーディングを決定します。失敗した場合は、ファイルに対して既定のエンコーディングを使用します。 どちらの場合も、fopen_s
は、書き込み専用アクセスでファイルを開き直します。 (この動作はモードにのみ適用され、モードには適用 a
されません a+
)。)
mode
文字列では、次のように、ファイルに要求するアクセスの種類を指定します。
mode |
アクセス |
---|---|
"r" |
読み取り用に開きます。 ファイルが存在しないか、見つからない場合、呼び出しは fopen_s 失敗します。 |
"w" |
書き込み用に空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。 |
"a" |
末尾に書き込みができるようにファイルを開きます (追加モード)。EOF (end-of-file) マーカーを削除せずにファイルに新しいデータを書き込みます。 ファイルが存在しない場合は、作成します。 |
"r+" |
読み取りと書き込みの両方のモードで開きます。 ファイルが存在する必要があります。 |
"w+" |
読み取りと書き込みの両方のモードで空のファイルを開きます。 そのファイルが既に存在すると、そのファイルの内容は破棄されます。 |
"a+" |
読み取りと追加の両方のモードでファイルを開きます。 追加操作には、新しいデータをファイルに書き込む前に EOF マーカーを削除することが含まれます。 書き込みの完了後に、EOF マーカーは復元されません。 ファイルが存在しない場合は、作成します。 |
アクセスの種類 "a"
または "a+"
を使用してファイルを開くと、すべての書き込み操作はファイルの末尾から行われます。 ファイル ポインターは、使用するか、またはrewind
を使用fseek
して再配置できますが、既存のデータを上書きできないように書き込み操作が実行される前に、常にファイルの末尾に戻されます。
"a"
モードでは、ファイルへの追加の前に EOF マーカーは削除されません。 追加が行われても、MS-DOS TYPE
コマンドでは元の EOF マーカーまでのデータしか表示されず、ファイルに追加されたデータは表示されません。 "a+"
モードでは、ファイルへの追加の前に EOF マーカーが削除されます。 追加が終了すると、MS-DOS TYPE
コマンドでファイル内すべてのデータが表示されます。 "a+"
このモードは、Z EOF マーカーで終わるストリーム・ファイルにCTRL
+追加するために必要です。
"r+"
、"w+"
、または "a+"
のいずれかのアクセスの種類を指定すると、読み取りと書き込みの両方を行うことができます。 (ファイルは "update" 用に開いていると言われます)。ただし、読み取りから書き込みに切り替える場合、入力操作は EOF マーカーに遭遇する必要があります。 EOF マーカーがない場合、ファイル ポジショニング関数の割り込みの呼び出しを使用する必要があります。 ファイル ポジショニング関数は、fsetpos
、fseek
、および rewind
です。 書き込みから読み取りに切り替えると、fflush
またはファイル ポジショニング関数に中間の呼び出しを使用する必要があります。
C11 以降では、"w"
または "w+"
に "x"
を付加すると、ファイルが存在する場合に上書きするのではなく、関数を失敗させることができます。
前の値に加えて、次の文字を含 mode
めて改行文字の変換モードを指定できます。
mode modifier |
変換モード |
---|---|
t |
ファイルをテキスト (変換) モードで開きます。 復帰改行 (CR-LF) の組み合わせは入力時に単一ライン フィード (LF) に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 Ctrl + Z は、入力時にファイルの末尾文字として解釈されます。 |
b |
ファイルをバイナリ (無変換) モードで開きます。復帰文字と改行文字の変換は行われません。 |
テキスト (翻訳済み) モードでは、 CTRL
+Z は入力時にファイルの終わり文字として解釈されます。 読み取り/書き込み用に開かれた"a+"
ファイルの場合は、 fopen_s
ファイルの末尾に Z をCTRL
+チェックし、可能な場合は削除します。 Z で終わるファイル内を使用fseek
してftell
移動すると、ファイルの末尾付近でCTRL
+不適切な動作が発生する可能性fseek
があるため、削除されます。
また、テキスト モードでは、復帰/改行 (CRLF) の組み合わせは入力時に単一行フィード (LF) 文字に変換され、LF 文字は出力時に CRLF の組み合わせに変換されます。 Unicode のストリーム入出力関数が既定のテキスト モードで動作すると、入力元または出力先のストリームはマルチバイト文字のシーケンスと仮定されます。 Unicode ストリーム入力関数はマルチバイト文字をワイド文字に変換し、mbtowc
関数を呼び出した場合と同様の効果を得ます。 同様の理由で、Unicode ストリーム出力関数は、 wctomb
関数が呼び出されたかのように、ワイド文字をマルチバイト文字に変換します。
t
または b
を mode
に指定しない場合、既定の変換モードは _fmode
グローバル変数によって定義されます。 t
または b
を引数の先頭に指定すると、エラーが発生して NULL
が返されます。
Unicode およびマルチバイト ストリーム I/O でテキスト モードとバイナリ モードを使用する方法の詳細については、テキスト モードとバイナリ モードのテキスト モードとバイナリ モードのファイル I/O および Unicode ストリーム I/O に関するページを参照してください。
mode modifier |
動作 |
---|---|
c |
関連付けられた filename のコミット フラグを有効にして、 fflush または _flushall のいずれかが呼び出された場合に、ファイル バッファーの内容がディスクに直接書き込まれるようにします。 |
n |
関連付けられている filename "コミットなし" のコミット フラグをリセットします。このフラグが既定値です。 また、プログラム COMMODE.OBJ を . プログラムCOMMODE.OBJ を明示的にリンクしない限り、グローバル コミット フラグの既定値は "コミットなし" です (リンク オプションを参照)。 |
N |
ファイルが子プロセスによって継承されないように指定します。 |
S |
キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。 |
R |
キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。 |
T |
メモリ不足が必要な場合を除き、ディスクに書き込まれないファイルを指定します。 |
D |
最後のファイル ポインターが閉じられたときに削除される一時ファイルを指定します。 |
ccs=UNICODE |
このファイルに使用するエンコード文字セットとして UNICODE を指定します。 何も指定しない場合は、ANSI エンコーディングが使用されます。 |
ccs=UTF-8 |
このファイルに使用するエンコード文字セットとして UTF-8 を指定します。 何も指定しない場合は、ANSI エンコーディングが使用されます。 |
ccs=UTF-16LE |
このファイルに使用するエンコード文字セットとして UTF-16LE を指定します。 何も指定しない場合は、ANSI エンコーディングが使用されます。 |
fopen_s
および _fdopen
で使用される mode
文字列として有効な文字は、_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 |
なし |
D |
_O_TEMPORARY |
R |
_O_RANDOM |
S |
_O_SEQUENTIAL |
T |
_O_SHORTLIVED |
ccs=UNICODE |
_O_WTEXT |
ccs=UTF-8 |
_O_UTF8 |
ccs=UTF-16LE |
_O_UTF16 |
、、、、S
、t
T
およびmode
D
オプションは Microsoft 拡張機能fopen_s
であり_wfopen_s
、ANSI 移植性が必要な場合は使用しないでください。 R
n
c
rb
モードを使用していて、コードを移植する必要がない、大量のファイルを読み込む予定がある、またはネットワーク パフォーマンスを気にする必要がない場合は、メモリ マップト Win32 ファイルも省略できる可能性があります。
に関してT
:D
T
は、メモリ不足で必要ない限り、ファイルをディスクに書き込むのを回避します。 詳細については、「File 属性定数」を参照FILE_ATTRIBUTE_TEMPORARY
してください。また、このブログ投稿は一時的なものです。D
は、ディスクに書き込まれる通常のファイルを指定します。 違いは、閉じられたときに自動的に削除されるということです。 組み合わせてTD
両方のセマンティクスを取得できます。
必要条件
機能 | 必須ヘッダー | C++ ヘッダー |
---|---|---|
fopen_s |
<stdio.h> |
<cstdio> |
_wfopen_s |
<stdio.h> または <wchar.h> |
<cstdio> |
C ランタイム ライブラリの標準準拠と名前付け規則の詳細については、「互換性」を参照してください。
汎用テキスト ルーチンのマップ
<tchar.h> ルーチン |
_UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
---|---|---|---|
_tfopen_s |
fopen_s |
fopen_s |
_wfopen_s |
ライブラリ
C ランタイム ライブラリのすべてのバージョン。
例
// crt_fopen_s.c
// 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 )
{
errno_t err;
// Open for read (will fail if file "crt_fopen_s.c" doesn't exist)
err = fopen_s( &stream, "crt_fopen_s.c", "r" );
if( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was opened\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not opened\n" );
}
// Open for write
err = fopen_s( &stream2, "data2", "w+, ccs=UTF-8" );
if( err == 0 )
{
printf( "The file 'data2' was opened\n" );
}
else
{
printf( "The file 'data2' was not opened\n" );
}
// Close stream if it isn't NULL
if( stream )
{
err = fclose( stream );
if ( err == 0 )
{
printf( "The file 'crt_fopen_s.c' was closed\n" );
}
else
{
printf( "The file 'crt_fopen_s.c' was not closed\n" );
}
}
// All other files are closed:
int numclosed = _fcloseall( );
printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1
関連項目
ストリーム入出力
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示