_fdopen、_wfdopen

下位入出力用として既に開かれているファイルにストリームを関連付けます。

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

パラメーター

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

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

戻り値

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

エラー コードの詳細については、「_doserrno、errno、_sys_errlist、および _sys_nerr」を参照してください。

解説

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

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

Tchar.h のルーチン

_UNICODE および _MBCS が未定義の場合

_MBCS が定義されている場合

_UNICODE が定義されている場合

_tfdopen

_fdopen

_fdopen

_wfdopen

mode 文字列では、ファイルの種類とファイル アクセスの方法を指定します。

mode 文字列では、次に示すように、ファイルに要求するアクセスの種類を指定します。

  • "r"
    読み出し用に開きます。 ファイルが存在しない場合や見つからない場合、fopen 呼び出しは失敗します。

  • "w"
    書き込み用に空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。

  • "a"
    末尾に書き込みができるようにファイルを開きます (追加モード)。ファイルが存在しない場合は、先にファイルを作成します。

  • "r+"
    読み出しと書き込みの両方のモードで開きます。 ファイルが存在している必要があります。

  • "w+"
    読み出しと書き込みの両方のモードで空のファイルを開きます。 指定したファイルが既に存在すると、そのファイルの内容は破棄されます。

  • "a+"
    読み出しと追加の両方のモードでファイルを開きます。ファイルが存在しない場合は、先にファイルを作成します。

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

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

  • t
    ファイルをテキスト (変換) モードで開きます。 このモードでは、入力時に復帰と改行 (CR-LF: Carriage Return–Linefeed) の組み合わせが 1 つの改行 (LF: Linefeed) に変換され、出力時に LF 文字が CR-LF に変換されます。 また、Ctrl + Z は入力時に EOF (EOF: end-of-file) 文字として解釈されます。 読み出しおよび書き込みの両方のモードで開かれたファイルでは、fopen がファイル末尾の CTRL+Z の有無を調べ、削除できる場合は削除します。 この処理が行われる理由は、Ctrl + Z で終わるファイル内を fseek 関数および ftell 関数を使用して移動すると、ファイルの終端付近で fseek が正しく動作しないことがあるためです。

  • b
    ファイルをバイナリ (非変換) モードで開きます。上記の変換は行われません。

  • c
    関連付けられた filename のコミット フラグを有効にして、fflush または _flushall のいずれかが呼び出された場合に、ファイル バッファーの内容がディスクに直接書き込まれるようにします。

  • n
    関連付けられた filename のコミット フラグを "コミットなし" にリセットします。これは、既定の設定です。 プログラムが Commode.obj にリンクされている場合、グローバル コミット フラグもオーバーライドします。 プログラムが明示的に Commode.obj にリンクされていない場合、グローバル コミット フラグの既定の設定は "コミットなし" です。

  • S
    キャッシュがディスクからのシーケンシャル アクセスに最適化されるように指定します。ただし、シーケンシャル アクセスに限定されるわけではありません。

  • R
    キャッシュがディスクからのランダム アクセスに最適化されるように指定します。ただし、ランダム アクセスに限定されるわけではありません。

  • T
    ファイルを一時ファイルとして指定します。 可能な場合、ファイルはディスクにフラッシュされません。

  • D
    ファイルを一時ファイルとして指定します。 最後のファイル記述子が閉じられると、ファイルは削除されます。

t、c、および n の各 mode オプションは、fopen および _fdopen の Microsoft 拡張機能です。ANSI 互換が必要な場合は使用しないでください。

t または b を mode に指定しないと、既定の変換モードは _fmode グローバル変数によって定義されます。 t または b を引数の先頭に指定すると、エラーが発生して NULL が返されます。 テキスト モードとバイナリ モードについては、「テキスト モードとバイナリ モードのファイル入出力」を参照してください。

fopen および _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

[なし]

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORT_LIVED

D

_O_TEMPORARY

必要条件

機能

必須ヘッダー

_fdopen

<stdio.h>

_wfdopen

<stdio.h> または <wchar.h>

互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。

使用例

// crt_fdopen.c
// This program opens a file 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 with fclose, not _close.
   fclose( stream );
   printf( "Lines in file: %d\n", count );
}

入力:crt_fdopen.txt

Line one
Line two

出力

Lines in file: 2

同等の .NET Framework 関数

System::IO::FileStream::FileStream

参照

参照

ストリーム入出力

_dup、_dup2

fclose、_fcloseall

fopen、_wfopen

freopen、_wfreopen

_open、_wopen