次の方法で共有


_fdopen, _wfdopen

ストリームを前回下位入出力で開いたファイルに関連付けます。

構文

FILE *_fdopen(
   int fd,
   const char *mode
);
FILE *_wfdopen(
   int fd,
   const wchar_t *mode
);

パラメーター

fd
開いているファイルのファイル記述子。

mode
ファイル アクセスの種類。

戻り値

これらの各関数は、開いているストリームへのポインターを返します。 エラーが発生すると、NULL のポインター値を返します。 エラーが発生すると、「パラメーターの検証 で説明されているように、無効なパラメーター ハンドラーが呼び出。 実行の継続が許可された場合、errnoEBADF に設定されて無効なファイル記述子であることを示すか、EINVAL に設定されて mode が null ポインターだったことを示すかのいずれかになります。

これらのエラー コードやその他のエラー コードについては、「errno_doserrno_sys_errlist、および _sys_nerr」を参照してください。

解説

_fdopen 関数は、fd によって識別されるファイルに入出力ストリームを関連付けることにより、下位入出力で開かれているファイルをバッファーおよびフォーマットできるようにします。 _wfdopen 関数は、 _fdopen関数のワイド文字バージョンです。 mode 関数の引数 _wfdopen は、ワイド文字列です。 それ以外では、_wfdopen_fdopen の動作は同じです。

_fdopenに渡されるファイル記述子は、返されたFILE * ストリームによって所有されます。 _fdopen成功した場合は、ファイル記述子で_closeを呼び出さないでください。 返されたFILE *fcloseを呼び出すと、ファイル記述子も閉じます。

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

mode文字列は、ファイルに対して要求されるファイル アクセスの種類を指定します。

mode アクセス
"r" 読み取り用に開きます。 ファイルが存在しないか、見つからない場合、 fopen 呼び出しは失敗します。
"w" 書き込み用に空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。
"a" 末尾に書き込まれるようにファイルを開きます (追加モード)。 ファイルが存在しない場合は、作成します。
"r+" 読み取りと書き込みの両方のモードで開きます。 ファイルが存在する必要があります。
"w+" 読み取りと書き込みの両方のモードで空のファイルを開きます。 そのファイルが既に存在すると、そのファイルの内容は破棄されます。
"a+" 読み取りと追加の両方のモードでファイルを開きます。 ファイルが存在しない場合は、作成します。

アクセスの種類 "a" または "a+" を使用してファイルを開くと、すべての書き込み操作はファイルの末尾から行われます。 ファイル ポインターは、 fseek または rewindを使用して再配置できますが、書き込み操作が実行される前に常にファイルの末尾に戻ります。したがって、既存のデータを上書きすることはできません。 "r+""w+"、または "a+" のいずれかのアクセスの種類を指定すると、読み取りと書き込みの両方を行うことができます (ファイルは "更新" モードで開きます)。 ただし、読み取りと書き込みを切り替える場合は、その前に fflushfsetposfseek、または rewind のいずれかの操作を実行する必要があります。 必要であれば、fsetpos または fseek 操作の現在の位置を指定できます。

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

mode modifier Behavior
t ファイルをテキスト (変換) モードで開きます。 このモードでは、復帰と改行 (CR-LF) の組み合わせは入力時に 1 つの改行 (LF) 文字に変換され、LF 文字は出力時に CR-LF の組み合わせに変換されます。 また、Ctrl + Z は入力時に EOF (end-of-file) 文字として解釈されます。
b バイナリ (無変換) モードで開きます。 t モードからの変換は何も行われません。
c 関連付けられた filename のコミット フラグを有効にして、 fflush または _flushall のいずれかが呼び出された場合に、ファイル バッファーの内容がディスクに直接書き込まれるようにします。
n 関連付けられている filename のコミット フラグを "コミットなし" にリセットします。このフラグが既定値です。 また、プログラムを Commode.objにリンクすると、グローバル コミット フラグもオーバーライドされます。 プログラムを Commode.objに明示的にリンクしない限り、グローバル コミット フラグの既定値は "コミットなし" です。

tc、およびn modeオプションは、fopen_fdopen用の Microsoft 拡張機能です。 ANSI 移植性を維持する場合は使用しないでください。

t または bmode に指定しない場合、既定の変換モードは _fmode グローバル変数によって定義されます。 t または b を引数の先頭に指定すると、エラーが発生して NULLが返されます。 テキスト モードとバイナリ モードの詳細については、「 Text および binary mode file I/O を参照してください。

fopenおよび_fdopenで使用されるmode文字列の有効な文字は、次の表に示すように、_openおよび_sopenで使用されるoflag引数に対応します。

mode 文字列の文字 _openと同等のoflag_sopen
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 なし

要件

機能 必須ヘッダー C++ ヘッダー
_fdopen <stdio.h> <cstdio>
_wfdopen <stdio.h> または <wchar.h> <cstdio>

C ランタイム ライブラリの標準準拠と名前付け規則の詳細については、「 Compatibilityを参照してください。

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

<tchar.h> ルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tfdopen _fdopen _fdopen _wfdopen

// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>

int main( void )
{
   FILE *stream;
   int  fd, count = 0;
   char inbuf[128];

   // Open a file.
   if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
      exit( 1 );

   // Get stream from file descriptor.
   if( (stream = _fdopen( fd, "r" )) == NULL )
      exit( 1 );

   while( fgets( inbuf, 128, stream ) != NULL )
      count++;

   // After _fdopen, close by using fclose, not _close.
   fclose( stream );
   printf( "Lines in file: %d\n", count );
}

入力: crt_fdopen.txt

Line one
Line two

出力

Lines in file: 2

関連項目

ストリーム入出力
_dup, _dup2
fclose, _fcloseall
fopen, _wfopen
freopen, _wfreopen
_open, _wopen