現在 oldStream に関連付けられているファイルを閉じ、fileName によって指定されたファイルに stream を再割り当てします。
これらのバージョンのfreopen_wfreopen、「CRT のセキュリティ機能説明されているように、セキュリティが強化。
構文
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。それ以外の場合はエラー コード。 エラーが発生した場合、元のファイルは閉じられ、streamがされていない限り、streamにNULLが書き込まれます。NULL
エラー コードの詳細については、「errno、_doserrno、_sys_errlist、_sys_nerr」を参照してください。
解説
通常、freopen_s 関数は、stdin、stdout、stderr に関連付けられている事前に開いたストリームを別のファイルにアタッチするために使用されます。
freopen_s関数は、現在streamに関連付けられているファイルを閉じ、pathで指定されたファイルにstreamを再割り当てします。 _wfreopen_s は freopen_s のワイド文字バージョンであり、_wfreopen_s に対する path 引数と mode 引数はワイド文字列です。 それ以外では、_wfreopen_s と freopen_s の動作は同じです。
pFile、path、mode、またはstreamのいずれかがNULLされている場合、またはpathが空の文字列の場合、これらの関数は、パラメーター検証で説明されているように、無効なパラメーター ハンドラーを呼び出します。 実行の継続が許可された場合、これらの関数は errno を EINVAL に設定し、EINVAL を返します。
既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT でのグローバル状態」を参照してください。
汎用テキスト ルーチンのマップ
TCHAR.H ルーチン |
_UNICODE と _MBCS が定義されていない |
_MBCS が定義されている |
_UNICODE が定義されている |
|---|---|---|---|
_tfreopen_s |
freopen_s |
freopen_s |
_wfreopen_s |
freopen_s は、通常、既に開いているファイル stdin、stdout、および 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+" の場合にファイルを開くと、すべての書き込み操作はファイルの末尾から行われます。 fseekまたはrewindを使用してファイル ポインターの位置を変更できますが、書き込み操作が実行される前に、ファイル ポインターは常にファイルの末尾に戻されます。したがって、既存のデータを上書きすることはできません。
"a" モードでは、ファイルへの追加の前に EOF マーカーは削除されません。 追加が行われても、MS-DOS TYPE コマンドでは元の EOF マーカーまでのデータしか表示されず、ファイルに追加されたデータは表示されません。 "a+" モードでは、ファイルへの追加の前に EOF マーカーが削除されます。 追加が終了すると、MS-DOS の TYPE コマンドでファイル内すべてのデータが表示されます。 Ctrl + Z EOF マーカーで終了するストリーム ファイルに追加するには、 "a+" モードを使用する必要があります。
"r+"、"w+"、または "a+" のいずれかのアクセスの種類を指定すると、読み取りと書き込みの両方を行うことができます (ファイルは "更新" モードで開きます)。 ただし、読み取りと書き込みを切り替える場合は、その前に fsetpos、fseek、または 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 または b を mode に指定しない場合、既定の変換モードは _fmode グローバル変数によって定義されます。 t または b を引数の先頭に指定すると、エラーが発生して NULLが返されます。
テキスト モードとバイナリ モードの詳細については、「 Text および binary mode file I/O を参照してください。
要件
| 機能 | 必須ヘッダー |
|---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> または <wchar.h> |
ユニバーサル Windows プラットフォーム (UWP) アプリではコンソールがサポートされていません。 コンソール (stdin、stdout、stderr) に関連付けられている標準ストリームのハンドルは、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