fopen / fopen_s并写入文件
我在C中使用fopen将输出写入文本文件。 函数声明是( ARRAY_SIZE
已经定义了ARRAY_SIZE
):
void create_out_file(char file_name[],long double *z1){ FILE *out; int i; if((out = fopen(file_name, "w+")) == NULL){ fprintf(stderr, "***> Open error on output file %s", file_name); exit(-1); } for(i = 0; i < ARRAY_SIZE; i++) fprintf(out, "%.16Le\n", z1[i]); fclose(out); }
我的问题:
-
在使用MVS2008进行编译时,我收到警告:警告C4996:’fopen’:此函数或变量可能不安全。 考虑使用fopen_s代替。 我没有看到关于
fopen_s
更多信息,以便我可以更改我的代码。 有什么建议? -
可以指示
fprintf
以所需的数字精度将数字写入文件吗? 如果我使用long double
那么我认为我的答案是好的,直到小数点后15位。 我对吗?
fopen_s
是fopen
一个变种,它包含参数validation并在打开过程中出现错误时返回错误代码而不是指针。 它比基本变体更安全,因为它占据了更多边缘条件。 编译器警告您使用它,因为fopen
表示应用程序中的潜在利用向量。
您可以使用说明符%.xg
为printf
族指定精度数字,其中x是输出中所需精度的数字。 从平台到平台, long double
精度的精度不同,但通常可以认为它至少是16位小数精度。
编辑:虽然我并没有完全fopen_s
完全浪费时间的其他人,但它确实代表了很低的开发机会,并没有得到广泛的支持。 在C4996下警告的一些其他function是更严重的漏洞,然而,使用_CRT_SECURE_NO_WARNINGS
相当于关闭“你让卧室门解锁”和“你在厨房里留下核弹”的警报。
只要您不限制在项目中使用“纯C”(例如学校作业或嵌入式微控制器),您就可以利用几乎所有现代C编译器都是C ++编译器并使用所有这些I / O函数的C ++ iostream
变体,以便同时获得改进的安全性和兼容性。
我遇到了一个与Visual Studio 2012一样的问题,但我的问题扩展到了我正在构建一个程序,我想使用Visual Studio的铃声和口哨进行测试,最终能够编译和运行我的同一个应用程序Linux服务器(我正在制作机器人)
所以这是我在一些谷歌之后想出来的,并且我认为我会发布它,以防它可以帮助其他任何人。
FILE *fp_config; const char *configfile ; configfile = "bot.conf"; #ifdef WIN32 errno_t err; if( (err = fopen_s( &fp_config, configfile, "r" )) !=0 ) { #else if ((fp_config = fopen(configfile, "r")) == NULL) { #endif fprintf(stderr, "Cannot open config file %s!\n", configfile); }
这将安抚Visual Studio,它不会抱怨,它也将允许相同的代码在gcc或任何其他符合标准的c / c ++编译器上编译
-
fopen_s
和所有其他_s函数是标准函数的特定于MS的“安全”变体。 如果您的代码不需要跨平台,那么您只需切换并使编译器满意。 否则,只需将_CRT_SECURE_NO_WARNINGS
预处理器指令添加到项目设置中,它就会停止向您发出警告。 -
是的,长双倍很容易获得15位精度; 实际上,即使是常规的双打也足够好(但不会更多)。
其他海报指出,fopen并非真的非常不安全。 如果您不想要此警告,但您确实需要其他警告真正漏洞的警告,请不要#define _CRT_SECURE_NO_WARNINGS
。
相反,下次您收到fopen警告时,请单击“查看’fopen’的声明”行。 这将带您到stdio.h中注入警告的行。 从该行删除文本_CRT_INSECURE_DEPRECATE(fopen_s)
,当您使用fopen时将不再获得安全警告,但它将保留为strcpy,strdup和其他可能危险的警告。
从fopen移动到fopen_s禁用了在文件打开和写入时在记事本(只读)中打开文件的function。 回到fopen,我可以阅读wile我的程序写入文件。
在包含任何文件之前定义_CRT_SECURE_NO_WARNINGS
以消除此警告,并停止相信MS对fopen
所说的内容