2 回答

TA贡献1802条经验 获得超5个赞
两个申明如下:
errno_t fopen_s(
FILE** pFile,
const char *filename,
const char *mode
);
errno_t _wfopen_s(
FILE** pFile,
const wchar_t *filename,
const wchar_t *mode
);
函数参数和返回值
[输出] pFile (FILE*)指针 [输入] filename 文件名(可以加文件路径) [输入] mode 访问方式。 --------------------------------------------------- 返回值: 如果成功返回0,失败则返回相应的错误代码。 错误代码请到_doserrno,errno, _sys_errlist, and _sys_nerr去了解更多 错误条件 pFile filename mode 返回值 pFile的内容
NULL 任何 任何 EINVAL 没有改变
任何 NULL 任何 EINVAL 没有改变
任何 任何 NULL EINVAL 没有改变
EINVAL:无效的参数。 备注: 文件由fopen_s和_wfopen_s打开不能共享。(也就是别人无法读/写和访问)如果你确实想让他可以访问, use _fsopen,_wfsopen withthe appropriate sharing mode constant (例如, _SH_DENYNOfor read/write sharing). ……
编辑本段文件访问方式
"r" 只读,若文件不在则出错。 "w" 打开一个空文件来编写。若文件已经存在,内容会被全部清空;若文件不在则创建。(不可以创建文件夹)。 "a" 若文件存在就在文件末尾追加字符(也就是把光标移动到文件的EOF处),若文件不在就创建。 EOF:结束标志 "r+" 读/写,都可以。文件必须存在。 "w+" 就是"W"再多一个阅读的权力。也清空内容。 "a+" 读/写,并且把光标移动到EOF处。 当使用”a”和”a+”来打开一个文件时,光标会自动移动到EOF处,如果需要定位光标,则需要用到fseek 或者 rewind 函数。

TA贡献1995条经验 获得超2个赞
_wfopen_s()不是标准C里的函数,只能在windows上用,Linux下没有这个函数。
fopen()你应该很清楚了,就是你传入一个文件名和读写模式,然后它就给你一个FILE*句柄。文件名是char *类型的。
_wfopen_s()跟fopen()有两点区别:
1. _w表示传入的参数是wchar_t *类型的。就是说,你必须传入unicode字符串。在中文操作系统里,日文,韩文或者泰文等非拉丁语系的文字,如果用普通字符串表示,可能会显示成乱码,这个时候你用fopen()函数就没法打开指定的文件。反之,中文在其他语言的操作系统里也有一样问题。而unicode就没有这个问题,所以最好用_w版本的fopen。
2. _s表示该函数是线程安全的。就是说fopen()是非线程安全的,而_wfopen_s()是线程安全的。关于线程安全的定义,你自己用搜索引擎搜一下就知道了。
添加回答
举报