当前位置:  开发笔记 > 运维 > 正文

fopen/fopen_s并写入文件

如何解决《fopen/fopen_s并写入文件》经验,为你挑选了3个好方法。

我在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++ 变体,以便同时获得改进的安全性兼容性.



1> Dan Story..:

fopen_s是一个变体,fopen其中包含参数验证,并在打开过程中出现问题时,提交错误代码而不是指针.它比基本变体更安全,因为它占据了更多边缘条件.编译器警告您使用它,因为它fopen代表了应用程序中的潜在利用向量.

您可以printf使用说明符指定函数族的精度数字%.xg,其中x是输出中所需精度的数字.一个long double从平台到平台的精度各不相同,但一般可以赌它是分数精确度至少16位.

编辑:虽然我不完全在船上,谁是这表明其他人fopen_s完全浪费时间,它确实代表了相当低的剥削机会,它没有得到广泛的支持.在C4996下警告的一些其他功能是更严重的漏洞,然而,使用_CRT_SECURE_NO_WARNINGS相当于关闭"你离开卧室门解锁"和"你在厨房里留下核弹"的警报.

只要您不限制在项目中使用"纯C"(例如学校作业或嵌入式微控制器),您就可以利用几乎所有现代C编译器都是C++编译器并使用iostream所有这些I/O函数的C++ 变体,以便同时获得改进的安全性兼容性.



2> BrierMay..:

我遇到了与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 ++编译器上编译



3> tzaman..:

    fopen_s所有其他_s函数都是标准函数的MS特定"安全"变体.如果您的代码不需要跨平台,您只需切换并使编译器满意.否则,只需将_CRT_SECURE_NO_WARNINGS预处理器指令添加到项目设置中,它就会停止向您发出警告.

    是的,长双倍很容易获得15位精度; 实际上,即使是常规的双打也足够好(但不会更多).

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有