fopen_s, _wfopen_s

ファイルを開きます。 これらのバージョンでは、「_wfopenCRTfopenセキュリティ機能」で説明されているように、セキュリティが強化されています。

構文

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 のパスを構築する場合は、実行時環境で使用できるドライブ、パス、またはネットワーク共有に関して推測を使用しないでください。 パスのディレクトリ区切り記号として、スラッシュ (/) または円記号 (\) を使用できます。

これらの関数では、パラメーターの検証が行われます。 または modefilenamenull ポインターの場合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 使用可能な値は UNICODEUTF-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 マーカーがない場合、ファイル ポジショニング関数の割り込みの呼び出しを使用する必要があります。 ファイル ポジショニング関数は、fsetposfseek、および rewind です。 書き込みから読み取りに切り替えると、fflush またはファイル ポジショニング関数に中間の呼び出しを使用する必要があります。

C11 以降では、"w" または "w+""x" を付加すると、ファイルが存在する場合に上書きするのではなく、関数を失敗させることができます。

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

mode modifier 変換モード
t ファイルをテキスト (変換) モードで開きます。 復帰改行 (CR-LF) の組み合わせは入力時に単一ライン フィード (LF) に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 Ctrl + Z は、入力時にファイルの末尾文字として解釈されます。
b ファイルをバイナリ (無変換) モードで開きます。復帰文字と改行文字の変換は行われません。

テキスト (翻訳済み) モードでは、 CTRL+Z は入力時にファイルの終わり文字として解釈されます。 読み取り/書き込み用に開かれた"a+"ファイルの場合は、 fopen_s ファイルの末尾に ZCTRL+チェックし、可能な場合は削除します。 Z で終わるファイル内を使用fseekしてftell移動すると、ファイルの末尾付近でCTRL+不適切な動作が発生する可能性fseekがあるため、削除されます。

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

t または bmode に指定しない場合、既定の変換モードは _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

、、、、StTおよびmodeDオプションは Microsoft 拡張機能fopen_sであり_wfopen_s、ANSI 移植性が必要な場合は使用しないでください。 Rnc

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