_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 指针值指示错误。 如果 filename 或 mode 为 NULL 或空字符串,这些函数将触发无效参数处理程序,正如参数验证所述。 如果允许执行继续,则这些函数返回 NULL 并将 errno 设置为 EINVAL。
有关这些属性和其他错误代码的详细信息,请参阅 _doserrno、errno、_sys_errlist 和 _sys_nerr。
备注
_fsopen 函数通过将 filename 作为流并为后续的共享读取或编写准备文件来打开指定的文件,正如所定义的模式和 shflag 参数。 _wfsopen 是 _fsopen 的宽字符版本; filename 和 mode 参数到 _wfsopen 时宽字符字符串。 _wfsopen 和 _fsopen 行为相同,否则。
字符字符串 mode 指定为文件请求的访问类型,如下表所示。
术语 |
定义 |
---|---|
"r" |
打开以便读取。 如果文件不存在或找不到,_fsopen 调用将失败。 |
"w" |
打开用于写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
"a" |
打开写在文件(追加)的结束;如果它不存在,那么先创建文件。 |
"r+" |
打开以便读取和写入。(文件必须存在。) |
"w+" |
打开用于读取和写入的空文件。 如果给定文件存在,则其内容会被销毁。 |
"a+" |
打开用于读取和追加;如果它不存在,则先创建文件。 |
谨慎使用 "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 |
以二进制文件 (未转换的) 模式打开文件;上述转换被禁止。 |
S |
指定缓存针对(但不限于)从磁盘的顺序访问进行优化。 |
R |
指定缓存针对(但不限于)从磁盘的随机访问进行优化。 |
T |
将文件指定为临时。 如果可能,它不会刷新到磁盘。 |
D |
将文件指定为临时。 最后一个文件指针关闭时,它将被删除。 |
如果 t 或 b 在 mode 中未给出,则默认转换模式由全局变量 _fmode 定义。 如果 t 或 b 是该参数的前缀,则函数将失败并返回 NULL。 有关文本和二进制模式的讨论,请参见 文本和二进制架构文件 I/O。
参数 shflag 是常数表达式包含Share.h 定义的一个下清单常数。
术语 |
定义 |
---|---|
_SH_COMPAT |
为 16 位应用程序设置兼容性模式。 |
_SH_DENYNO |
允许读写访问权限。 |
_SH_DENYRD |
拒绝对文件的读访问。 |
_SH_DENYRW |
拒绝对文件的读访问和写访问。 |
_SH_DENYWR |
拒绝对文件的写访问。 |
一般文本例程映射
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" );
}