%>
打开具有文件共享的流。
语法
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 指针值指示错误。 如果 filename
或 mode
是 NULL
指针或空字符串,这些函数将调用无效参数处理程序,如参数验证中所述。 如果允许执行继续,则这些函数将返回 NULL
并将 errno
设置为 EINVAL
。
有关这些和其他错误代码的详细信息,请参阅 errno
、_doserrno
、_sys_errlist
和 _sys_nerr
。
备注
_fsopen
函数以流的形式打开由 filename
指定的文件并使该文件做好准备以进行后续的共享读写,如模式和 shflag
参数所定义。 _wfsopen
是 _fsopen
的宽字符版本;_wfsopen
的 filename
和 mode
参数是宽字符串。 除此以外,_wfsopen
和 _fsopen
的行为完全相同。
字符串 mode
指定为文件请求的访问类型,如下表所示。
术语 | 定义 |
---|---|
:" | 打开以便读取。 如果文件不存在或找不到,_fsopen 调用将失败。 |
:" | 打开用于写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
:" | 打开以便在文件末尾进行写入(追加);如果文件不存在,则先创建文件。 |
:" | 打开以便读取和写入。 (该文件必须存在。) |
:" | 打开用于读取和写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
:" | 打开以便进行读取和追加;如果文件不存在,则先创建。 |
使用 “w
” 和 “w+
” 类型时要小心,因为它们可能会破坏现有文件。
使用 “a
” 或 “a+
” 访问类型打开文件时,所有写入操作均将在文件末尾进行。 使用 fseek
或 rewind
可重新定位文件指针,但在执行任何写入操作前,文件指针将始终移回文件末尾。因此,无法覆盖现有数据。 指定 “r+
”、“w+
” 或 “a+
” 访问类型时,允许读取和写入(文件将处于打开状态以进行更新)。 但是,在读取与写入之间切换时,必须有中间 fsetpos
、fseek
或 rewind
操作。 如果需要的话,可以为 fsetpos
或 fseek
操作指定当前位置。 除了以上值之外,可以在 mode
中包含以下字符之一以指定换行符和文件管理的转换模式。
术语 | 定义 |
---|---|
t |
在文本(转换)模式下打开文件。 在这种模式下,输入时,回车换行 (CR-LF) 组合将转换为单一的换行 (LF);输出时,LF 字符将转换为 CR-LF 组合。 CTRL+Z 也将在输入时解释为文件尾字符。 在打开以进行读取或读取/写入的文件中,_fsopen 将检查文件末尾的 Ctrl+Z 并在可能的情况下将其移除。 它已被删除,因为使用 fseek 和 ftell 在以 CTRL+Z 结尾的文件中移动时,可能会导致 fseek 在文件末尾附近运行不当。 |
b |
在二进制(未转换)模式下打开文件;禁止上述转换。 |
D |
指定在关闭最后一个指向该文件的指针时删除的临时文件。 |
R |
指定缓存针对(但不限于)从磁盘的随机访问进行优化。 |
S |
指定缓存针对(但不限于)从磁盘的顺序访问进行优化。 |
T |
指定一个文件,除非内存压力需要它,否则不会写入磁盘。 |
如果 t
或 b
在 mode
中未给出,则转换模式由默认模式变量 _fmode
定义。 如果 t
或 b
是该参数的前缀,则函数将失败并返回 NULL
。 有关文本模式和二进制模式的讨论,请参阅文本和二进制模式文件 I/O。
关于 T
和 D
:
- 只要内存压力不需要,
T
就避免将文件写入磁盘。 有关详细信息,请参阅文件属性常量中的FILE_ATTRIBUTE_TEMPORARY
,以及此博客文章它只是暂时性的。 D
指定写入磁盘的常规文件。 区别在于它在关闭时会自动删除。 可以组合TD
来获取这两种语义。
_fsopen
和 _wfsopen
是 Microsoft 特定的 fopen
变体。 它们不属于 ANSI 标准。 对于移植性和安全性更强的函数,如果你不需要文件共享,请考虑 _wfopen_s
或 fopen_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.