文件访问的类型。

这些函数均返回指向打开流的指针。 一个 null 指针值指示错误。 出现错误时,会调用无效参数处理程序,如 参数验证 中所述。 如果允许继续执行,则 errno 会设置为 EBADF (这指示错误的文件描述符)或 EINVAL (这指示 mode 是空指针)。

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

_fdopen 函数将 I/O 流与 fd 标识的文件相关联,从而允许对为低级别 I/O 而打开的文件进行缓冲和格式化。 _wfdopen _fdopen 的宽字符版本; mode _wfdopen 参数是宽字符字符串。 除此以外, _wfdopen _fdopen 的行为完全相同。

传入 _fdopen 的文件描述符由返回的 FILE * 流拥有。 如果 _fdopen 成功,请不要对文件描述符调用 _close 。 对返回的 FILE * 调用 fclose 也会关闭文件描述符。

默认情况下,此函数的全局状态范围限定为应用程序。 若要更改此状态,请参阅 CRT 中的全局状态

字符串 mode 为文件指定请求的文件访问类型:

Access

使用 "a" "a+" 访问类型打开文件时,所有写入操作均将在文件末尾进行。 使用 fseek rewind 可重新定位文件指针,但在执行任何写入操作前,文件指针将始终被移回文件末尾。这样就不会覆盖现有数据。 指定 "r+" "w+" "a+" 访问类型时,允许读取和写入(文件将处于打开状态以进行“更新”)。 但是,在读取与写入之间切换时,必须有中间 fflush fsetpos fseek rewind 操作。 如果需要,可以为 fsetpos fseek 操作指定当前位置。

除了上述值之外,还可以在 中 mode 包含以下字符,以指定换行符的转换模式:

mode 修饰符 在文本(转换)模式下打开。 在这种模式下,输入时,回车换行 (CR-LF) 组合将转换为单一的换行 (LF);输出时,LF 字符将转换为 CR-LF 组合。 CTRL+Z 也将在输入时解释为文件尾字符。 在二进制(未转换)模式下打开。 会禁止从 t 模式进行任何转换。 启用关联 filename 的提交标志,以便在调用 fflush _flushall 时将文件缓冲区的内容直接写入磁盘。 将关联的 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

fopen _fdopen 中使用的 mode 字符串的有效字符对应于在 _open _sopen 中使用的 oflag 自变量,如下表中所示:

字符串中的 mode 字符 _open _sopen 的等效 oflag
// 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

Output

Lines in file: 2

流 I/O
_dup, _dup2
fclose, _fcloseall
fopen, _wfopen
freopen, _wfreopen
_open, _wopen