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

  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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值