1. 前言
- 旧版本的c++程序中,读取文件常采用fopen函数,但是在新的标准下会提示报错,提示fopen()并不安全(unsafe)。而带“_s”的版本是微软所做的改进方案,可以直接修改代码,但是比较麻烦。
- 报错提示:
error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
- 一种兼容的解决方法:(针对于不想修改源码时)
解决方案,项目 -->属性 --> c/c++ -->预处理器 --> 点击预处理器定义,编辑,加入_CRT_SECURE_NO_WARNINGS,即可。
2. 函数对比
2.1 fopen()
-
FILE * fopen(const char * path,const char * mode);
接收两个实参FILE *file; //若file= NULL,即文件未成功打开,函数返回false,否则返回true if((file= fopen("test.dat","w")) == NULL) return true; else return false;
-
fopen函数,可能被多个进程同时打开文件,进行读写操作,此时文件内容可能失去顺序性。
2.2 fopen_s
- fopen_s函数没有这个问题,只要前一次文件打开后还没有关闭文件,后一个程序就无法打开这个文件。
fopen_s(&fp, szFile, "r");
接受三个参数 注意第一个参数时File**
类型 区别于 fopen的File*
fopen_s(&fp, szFile, "r");
if(fp != NULL)
{
// See how long the file is
while (fgetc(fp) != EOF)
shaderLength++;
// Allocate a block of memory to send in the shader
assert(shaderLength < MAX_SHADER_LENGTH); // make me bigger!
if(shaderLength > MAX_SHADER_LENGTH)
{
fclose(fp);
return false;
}
........(省略)