_fdopen、_wfdopen

与一个先前在底层I/O打开的文件的流相联系。

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

参数

  • fd
    打开的文件的描述符。

  • mode
    文件访问类型

返回值

这些函数均返回指向打开流的指针。 一个 null 指针值指示错误。 当错误发生,则将调用无效参数处理程序,如 参数验证 所述。 如果允许继续执行,errno 也设置为 EBADF,指示一个坏文件说明符,或 EINVAL,指示 mode 为 null 指针。

有关这些属性和其他错误代码的详细信息,请参阅 _doserrno、errno、_sys_errlist 和 _sys_nerr

备注

_fdopen 函数与 I/O 流与由 fd标识的文件从而允许中打开。将缓存和格式的底层 I/O 的文件。 _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) 将转换为单一换行组合 (LF),输出时,LF字符将转换为 CR-LF组合。 此外,Ctrl+Z 被解释为输入的文件结尾字符。 在使用 fopen 打开以进行读取/写入的文件中, 将检查文件末尾的 Ctrl+Z 并将其移除(如果可能)。 这是因为使用 fseek 和 ftell函数在以 CTRL+Z 结尾的文件中移动时,可能导致 fseek 在文件末尾附近错误运行。

  • b
    在二进制 (未转换) 模式中打开。 从 t 模式的所有变换被禁止。

  • c
    启用关联 filename 的提交标志,以便在调用 fflush 或 _flushall 时将文件缓冲区的内容直接写入磁盘。

  • n
    将关联 filename 的提交标志重置为“no-commit”。这是默认设置。 如果使用 Commode.obj链接自己的程序,它还将重写全局提交标记。 除非将程序显式链接到Commode.obj,全局提交标志默认为“no-commit”(请参见)。

t、c和 n mode 选项是 fopen 和 _fdopen的 Microsoft 扩展。 如果希望保留 ANSI 可移植性,请不要使用。

如果 t 或 b 在 mode 中未给出,则默认转换模式由全局变量 _fmode 定义。 如果 t 或 b 是该参数的前缀,则函数将失败并返回 NULL。 有关文本和二进制模式的讨论,请参见 文本和二进制架构文件 I/O

有效字符 mode 字符串用于 fopen 及 _fdopen 相当于 oflag 中使用的参数 _open_sopen, 如下。

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

要求

功能

必需的标头

_fdopen

<stdio.h>

_wfdopen

<stdio.h> 或 <wchar.h>

有关更多兼容性信息,请参见兼容性

示例

// 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 );
}

Enter:crt_fdopen.txt

Line one
Line two

Output

Lines in file: 2

.NET Framework 等效项

System::IO::FileStream::FileStream

请参见

参考

流 I/O

_dup、_dup2

fclose、_fcloseall

fopen、_wfopen

freopen、_wfreopen

_open、_wopen