freopen_s, _wfreopen_s

現在 oldStream に関連付けられているファイルを閉じ、fileName によって指定されたファイルに stream を再割り当てします。

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

構文

errno_t freopen_s(
   FILE ** stream,
   const char * fileName,
   const char * mode,
   FILE* oldStream
);

errno_t _wfreopen_s(
   FILE ** stream,
   const wchar_t * fileName,
   const wchar_t * mode,
   FILE * oldStream
);

パラメーター

stream
関数が戻った時点で、再び開いたストリームを指す出力パラメーター。

fileName
再度開くファイルのパス。

mode
再度開いたストリームのモード。

oldStream
再度開くストリーム。 フラッシュされ、関連付けられているすべてのファイルが閉じられます。

戻り値

成功した場合は 0。それ以外の場合はエラー コード。 エラーが発生した場合、元のファイルは閉じられNULL、書き込まれますstreamstreamNULL

エラー コードの詳細については、「errno_doserrno_sys_errlist_sys_nerr」を参照してください。

解説

通常、freopen_s 関数は、stdinstdoutstderr に関連付けられている事前に開いたストリームを別のファイルにアタッチするために使用されます。

この関数はfreopen_s、現在関連付けられているstreamファイルを閉じ、で指定されたpathファイルに再割り当てしますstream_wfreopen_sfreopen_s のワイド文字バージョンであり、_wfreopen_s に対する path 引数と mode 引数はワイド文字列です。 それ以外では、_wfreopen_sfreopen_s の動作は同じです。

いずれかの場合、pathまたはstreammode空のNULL文字列の場合pathは、「パラメーターのpFile検証」で説明されているように、これらの関数は無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、これらの関数は errnoEINVAL に設定し、EINVAL を返します。

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

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

TCHAR.H ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tfreopen_s freopen_s freopen_s _wfreopen_s

freopen_s は、通常、既に開いているファイル stdinstdout、および stderr のユーザーが指定したファイルへのリダイレクトに使用されます。 関連付けられている stream 新しいファイルは、次のように、ファイルに対して要求されたアクセスの種類を指定する文字列である文字列で mode開かれます。

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

既存のファイルを破棄するため、"w""w+" の型は注意して使用します。 C11 以降では、"w" または "w+""x" を付加すると、ファイルが存在する場合に上書きするのではなく、関数を失敗させることができます。

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

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

"r+""w+"、または "a+" のいずれかのアクセスの種類を指定すると、読み取りと書き込みの両方を行うことができます (ファイルは "更新" モードで開きます)。 ただし、読み取りと書き込みを切り替える場合は、その前に fsetposfseek、または rewind の操作を実行する必要があります。 必要に応じて、fsetpos または fseek の操作に現在位置を指定できます。 上記の値に加え、mode 文字列に次の文字の 1 つを追加すると、改行の変換モードを指定できます。

mode modifier 変換モード
t ファイルをテキスト (変換) モードで開きます。
b ファイルをバイナリ (無変換) モードで開きます。復帰文字と改行文字の変換は行われません。

テキスト (変換) モードでは、復帰と改行 (CR-LF) の組み合わせは入力時に 1 つの改行 (LF) 文字に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 また、Ctrl + Z は入力時に EOF (end-of-file) 文字として解釈されます。 "a+" を使用して読み取りモード、または読み取りおよび書き込みの両方のモードで開かれたファイルでは、ランタイム ライブラリがファイル末尾に Ctrl + Z があるかどうかを確認し、削除できる場合は削除します。 ファイル内を使用 fseek して ftell 移動すると、ファイルの末尾付近で不適切な動作が発生する可能性 fseek があるため、削除されます。 ANSI 移植性が必要な場合、t オプションは Microsoft 拡張機能なので使用しないでください。

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

テキストモードとバイナリモードの詳細については、テキストモードおよびバイナリモードファイルI/Oを参照してください

必要条件

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

ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 コンソール (stdinstdoutstderr) に関連付けられている標準ストリームのハンドルは、C ランタイム関数によって UWP アプリで使用される前に、リダイレクトする必要があります。

互換性の詳細については、「 Compatibility」を参照してください。

// crt_freopen_s.c
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.

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

FILE *stream;

int main( void )
{
   errno_t err;
   // Reassign "stderr" to "freopen.out":
   err = freopen_s( &stream, "freopen.out", "w", stderr );

   if( err != 0 )
      fprintf( stdout, "error on freopen\n" );
   else
   {
      fprintf( stdout, "successfully reassigned\n" ); 
      fflush( stdout );
      fprintf( stream, "This will go to the file 'freopen.out'\n" );
      fclose( stream );
   }
   system( "type freopen.out" );
}
successfully reassigned
This will go to the file 'freopen.out'

関連項目

Stream I/O
freopen, _wfreopen
fclose, _fcloseall
_fdopen, _wfdopen
_fileno
fopen, _wfopen
_open, _wopen
_setmode