LOGO
Yutuo

最近做一个32位转64位的项目,需要把之前的警告全部改成非警告版。之前是用VS2005编译的,现在改成用VS2017编译。

在编译过程中,发现fopen是警告,警告说要改成fopen_s,但改完之后,发现跟原来的要求不同了。这个项目中,要求文件是不锁定的,也就是说常驻程序执行过程中,也能随时复制更新文件。但改成fopen_s之后,发现文件无法复制了。

找了一下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,应该改成_fsopen,然后在共享模式的参数设置为_SH_DENYNO

这三个函数的不同点应该就是参数不同,共享模式不同。

用语言说不明白,直接上代码说明它们的区别。

这三个函数的定义

C
// fopen
_Check_return_ _CRT_INSECURE_DEPRECATE(fopen_s)
_ACRTIMP FILE* __cdecl fopen(
	_In_z_ char const* _FileName,
	_In_z_ char const* _Mode
	);
// fopen_s
_Check_return_wat_
_ACRTIMP errno_t __cdecl fopen_s(
	_Outptr_result_maybenull_ FILE**      _Stream,
	_In_z_                    char const* _FileName,
	_In_z_                    char const* _Mode
	);
// _fsopen
_Check_return_
_ACRTIMP FILE* __cdecl _fsopen(
	_In_z_ char const* _FileName,
	_In_z_ char const* _Mode,
	_In_   int         _ShFlag
	);

这三个函数的使用方法

C
FILE    *pFile;
char    *filePath = "/tmp/test.txt";
// fopen
if((pFile = fopen(filePath, "wb")) == NULL) {
    printf("fopen ERROR");
    return 255;
}
// fopen_s
if((fopen_s(&pFile, filePath, "wb")) != 0) {
    printf("fopen_s ERROR");
    return 255;
}
// _fsopen
if((pFile = _fsopen(filePath, "wb", _SH_DENYNO)) == NULL) {
    printf("_fsopen ERROR");
    return 255;
}
转载请注明:宇托的狗窝 » C语言中的fopen、fopen_s、_fsopen的区别
上一篇 下一篇
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址