_fsopen_wfsopen

打开具有文件共享的流。

语法

FILE *_fsopen(
   const char *filename,
   const char *mode,
   int shflag
);
FILE *_wfsopen(
   const wchar_t *filename,
   const wchar_t *mode,
   int shflag
);

参数

filename
要打开的文件的名称。

mode
允许的访问类型。

shflag
允许的共享类型。

返回值

这些函数均返回指向流的指针。 一个 null 指针值指示错误。 如果 filenamemodeNULL 指针或空字符串,这些函数将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则这些函数将返回 NULL 并将 errno 设置为 EINVAL

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

备注

_fsopen 函数以流的形式打开由 filename 指定的文件并使该文件做好准备以进行后续的共享读写,如模式和 shflag 参数所定义。 _wfsopen_fsopen 的宽字符版本;_wfsopenfilenamemode 参数是宽字符串。 除此以外,_wfsopen_fsopen 的行为完全相同。

字符串 mode 指定为文件请求的访问类型,如下表所示。

术语 定义
"r" 打开以便读取。 如果文件不存在或找不到,_fsopen 调用将失败。
"w" 打开用于写入的空文件。 如果给定文件存在,则其内容会被销毁。
"a" 打开以便在文件末尾进行写入(追加);如果文件不存在,则先创建文件。
"r+" 打开以便读取和写入。 (该文件必须存在。)
"w+" 打开用于读取和写入的空文件。 如果给定文件存在,则其内容会被销毁。
"a+" 打开以便进行读取和追加;如果文件不存在,则先创建。

使用 ww+ 类型时要小心,因为它们可能会破坏现有文件。

使用 aa+ 访问类型打开文件时,所有写入操作均将在文件末尾进行。 使用 fseekrewind 可重新定位文件指针,但在执行任何写入操作前,文件指针将始终移回文件末尾。因此,无法覆盖现有数据。 指定 r+w+a+ 访问类型时,允许读取和写入(文件将处于打开状态以进行更新)。 但是,在读取与写入之间切换时,必须有中间 fsetposfseekrewind 操作。 如果需要的话,可以为 fsetposfseek 操作指定当前位置。 除了以上值之外,可以在 mode 中包含以下字符之一以指定换行符和文件管理的转换模式。

术语 定义
t 在文本(转换)模式下打开文件。 在这种模式下,输入时,回车换行 (CR-LF) 组合将转换为单一的换行 (LF);输出时,LF 字符将转换为 CR-LF 组合。 CTRL+Z 也将在输入时解释为文件尾字符。 在打开以进行读取或读取/写入的文件中,_fsopen 将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 它已被删除,因为使用 fseekftell 在以 CTRL+Z 结尾的文件中移动时,可能会导致 fseek 在文件末尾附近运行不当。
b 在二进制(未转换)模式下打开文件;禁止上述转换。
D 指定在关闭最后一个指向该文件的指针时删除的临时文件。
R 指定缓存针对(但不限于)从磁盘的随机访问进行优化。
S 指定缓存针对(但不限于)从磁盘的顺序访问进行优化。
T 指定一个文件,除非内存压力需要它,否则不会写入磁盘。

如果 tbmode 中未给出,则转换模式由默认模式变量 _fmode 定义。 如果 tb 是该参数的前缀,则函数将失败并返回 NULL。 有关文本模式和二进制模式的讨论,请参阅文本和二进制模式文件 I/O

关于 TD

  • 只要内存压力不需要,T 就避免将文件写入磁盘。 有关详细信息,请参阅文件属性常量中的 FILE_ATTRIBUTE_TEMPORARY,以及此博客文章它只是暂时性的
  • D 指定写入磁盘的常规文件。 区别在于它在关闭时会自动删除。 可以组合 TD 来获取这两种语义。

_fsopen_wfsopen 是 Microsoft 特定的 fopen 变体。 它们不属于 ANSI 标准。 对于移植性和安全性更强的函数,如果你不需要文件共享,请考虑 _wfopen_sfopen_s

shflag 参数是常量表达式,它包含 Share.h 中定义的以下清单常量之一。

术语 定义
_SH_DENYNO 允许读取和写入访问。
_SH_DENYRD 拒绝对文件的读取访问。
_SH_DENYRW 拒绝对文件的读取和写入访问。
_SH_DENYWR 拒绝对文件的写入访问。

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

一般文本例程映射

Tchar.h 例程 _UNICODE_MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_tfsopen _fsopen _fsopen _wfsopen

要求

函数 必需的标头 可选标头
_fsopen <stdio.h> <share.h>

用于 shflag 参数的清单常量。
_wfsopen <stdio.h><wchar.h> <share.h>

用于 shflag 参数的清单常量。

示例

// crt_fsopen.c

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

int main( void )
{
   FILE *stream;

   // Open output file for writing. Using _fsopen allows us to
   // ensure that no one else writes to the file while we are
   // writing to it.
    //
   if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
   {
      fprintf( stream, "No one else in the network can write "
                       "to this file until we are done.\n" );
      fclose( stream );
   }
   // Now others can write to the file while we read it.
   system( "type outfile" );
}
No one else in the network can write to this file until we are done.

另请参阅

流 I/O
fclose_fcloseall
_fdopen_wfdopen
ferror
_fileno
fopen_wfopen
freopen_wfreopen
_open_wopen
_setmode
_sopen_wsopen