您的位置:首页 > 运维架构

fopen,fopen_s,_wfopen_s与_fsopen, _wfsopen的区分

2016-01-19 19:41 761 查看
C++做项目的过程中,需要实现文件打开保存的一个功能,当我对文件tmp.dat进行写操作以后,想要第二次对此文件进行写操作,此时用fopen_s,_wfopen_s均出现返回int error = 13也就是EACCES (Permission
denied)的错误。

而由于项目是Unicode编码,没办法用fopen进行文件操作(其实只要在预编译中加入_CRT_SECURE_NO_WARNINGS,用fopen是可以的,并且可以进行共享读写,但是我不想这样做)。于是各种搜索,以及查阅MSDN。MSDN上是这么说的:

Files opened by fopen_s and
_wfopen_s are not sharable. If you require that a file be sharable, use _fsopen, _wfsopen with the appropriate sharing mode constant (for example, _SH_DENYNO for read/write sharing).

链接:https://msdn.microsoft.com/zh-cn/library/z5hh6ee9(v=vs.90).aspx

就是说,fopen_s 和 _wfopen_s不支持文件共享,当你用fopen_s
或 _wfopen_s进行读或写操作的时候,只能进行一次操作(即只能进行一次读写操作),注意:当你在不同的地方对某一文件只要使用过一次fopen_s 或 _wfopen_s,这个文件就变成非共享的文件了,再次进行读写的时候,就可能会返回int error
= 13也就是EACCES (Permission
denied)的错误。我在项目中就是只改了一个地方,结果二次读写的时候仍然不对,需要将所有涉及此文件读写的地方都改成_fsopen, _wfsopen的读写方式。

文件共享的二进制写操作的代码为:FILE *fp = _wfsopen(tmpFile, _T("wb"), _SH_DENYNO);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: