freopen_s、_wfreopen_s
更新 : 2007 年 11 月
ファイル ポインタを再度割り当てます。これらの関数は、「CRT のセキュリティ強化」に説明されているように、freopen、_wfreopen のセキュリティが強化されたバージョンです。
errno_t freopen(
FILE** pFile,
const char *path,
const char *mode,
FILE *stream
);
errno_t _wfreopen(
FILE** pFile,
const wchar_t *path,
const wchar_t *mode,
FILE *stream
);
パラメータ
[出力] pFile
呼び出しによって指定されるファイル ポインタへのポインタ。[入力] path
新しいファイルのパス。[入力] mode
アクセス許可の種類。[入力] stream
FILE 構造体へのポインタ。
戻り値
各関数は、エラー コードを返します。エラーが発生した場合、元のファイルが閉じられます。
解説
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 を返します。
汎用テキスト ルーチンのマップ
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 マーカーは削除されません。ファイルが存在しない場合は、先にファイルを作成します。"r+"
読み出しと書き込みの両方のモードで開きます。ファイルが存在している必要があります。"w+"
読み出しと書き込みの両方のモードで空のファイルを開きます。指定したファイルが既に存在すると、そのファイルの内容は破棄されます。"a+"
読み出しと追加の両方のモードでファイルを開きます。追加時には、ファイルに新しいデータを書き込む前に EOF マーカーを削除し、書き込みが終了すると EOF マーカーを復元します。ファイルが存在しない場合は、先にファイルを作成します。
アクセスの種類が "w" および "w+" の場合は既存のファイルを破棄する可能性があるので、使用時には注意が必要です。
アクセスの種類が "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 文字列に次のいずれかの文字を指定すると、改行文字の変換モードを指定できます。
t
ファイルをテキスト (変換) モードで開きます。このモードでは、入力時にキャリッジ リターンとライン フィード (CR-LF: carriage return–linefeed) が単独のライン フィード (LF: linefeed) 文字に変換され、出力時に LF 文字が CR-LF に変換されます。また、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。ファイルを読み取りモードで開いた場合、または "a+" を指定して読み取りと書き込みの両方のモードで開いた場合、ランタイム ライブラリによってファイル末尾の Ctrl + Z が確認され、削除できる場合は削除されます。この処理が行われるのは、ファイル内を fseek 関数および ftell 関数を使用して移動すると、ファイル末尾付近で fseek が正しく動作しないことがあるからです。t オプションは、Microsoft 拡張機能なので、ANSI 互換が必要な場合は使用しないでください。b
ファイルをバイナリ (非変換) モードで開きます。上記の変換は行われません。
t または b を mode に指定しないと、既定の変換モードは _fmode グローバル変数によって定義されます。t または b を引数の先頭に指定すると、エラーが発生して NULL が返されます。
テキスト モードとバイナリ モードについては、「テキスト モードとバイナリ モードのファイル入出力」を参照してください。
必要条件
関数 |
必須ヘッダー |
---|---|
freopen_s |
<stdio.h> |
_wfreopen_s |
<stdio.h> または <wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// 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'