我在C中使用fopen将输出写入文本文件.函数声明是(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位.我对吗?
Dan Story.. 20
fopen_s
是一个变体,fopen
其中包含参数验证,并在打开过程中出现问题时,提交错误代码而不是指针.它比基本变体更安全,因为它占据了更多边缘条件.编译器警告您使用它,因为它fopen
代表了应用程序中的潜在利用向量.
您可以printf
使用说明符指定函数族的精度数字%.xg
,其中x是输出中所需精度的数字.一个long double
从平台到平台的精度各不相同,但一般可以赌它是分数精确度至少16位.
编辑:虽然我不完全在船上,谁是这表明其他人fopen_s
是完全浪费时间,它确实代表了相当低的剥削机会,它没有得到广泛的支持.在C4996下警告的一些其他功能是更严重的漏洞,然而,使用_CRT_SECURE_NO_WARNINGS
相当于关闭"你离开卧室门解锁"和"你在厨房里留下核弹"的警报.
只要您不限制在项目中使用"纯C"(例如学校作业或嵌入式微控制器),您就可以利用几乎所有现代C编译器都是C++编译器并使用iostream
所有这些I/O函数的C++ 变体,以便同时获得改进的安全性和兼容性.
fopen_s
是一个变体,fopen
其中包含参数验证,并在打开过程中出现问题时,提交错误代码而不是指针.它比基本变体更安全,因为它占据了更多边缘条件.编译器警告您使用它,因为它fopen
代表了应用程序中的潜在利用向量.
您可以printf
使用说明符指定函数族的精度数字%.xg
,其中x是输出中所需精度的数字.一个long double
从平台到平台的精度各不相同,但一般可以赌它是分数精确度至少16位.
编辑:虽然我不完全在船上,谁是这表明其他人fopen_s
是完全浪费时间,它确实代表了相当低的剥削机会,它没有得到广泛的支持.在C4996下警告的一些其他功能是更严重的漏洞,然而,使用_CRT_SECURE_NO_WARNINGS
相当于关闭"你离开卧室门解锁"和"你在厨房里留下核弹"的警报.
只要您不限制在项目中使用"纯C"(例如学校作业或嵌入式微控制器),您就可以利用几乎所有现代C编译器都是C++编译器并使用iostream
所有这些I/O函数的C++ 变体,以便同时获得改进的安全性和兼容性.
我遇到了与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位精度; 实际上,即使是常规的双打也足够好(但不会更多).