gpt4 book ai didi

c - fopen/fopen_s 和写入文件

转载 作者:太空狗 更新时间:2023-10-29 16:25:41 30 4
gpt4 key购买 nike

我在 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);
}

我的问题:

  1. 在使用 MVS2008 进行编译时,我收到警告:warning C4996: 'fopen': This function or variable may be unsafe。考虑改用 fopen_s。我没有看到太多关于 fopen_s 的信息,所以我可以更改我的代码。有什么建议么?

  2. 是否可以指示 fprintf 以所需的数值精度将数字写入文件?如果我使用的是 long double,那么我假设我的答案在小数点后 15 位数字之前都是正确的。我对吗?

最佳答案

fopen_sfopen 的变体,它包含参数验证并返回错误代码而不是指针,以防在打开过程中出现问题。它比基本变体更安全,因为它考虑了更多的边缘条件。编译器警告您使用它,因为 fopen 表示您的应用程序中的潜在开发 vector 。

您可以使用说明符 %.xgprintf 函数系列指定精度位数,其中 x 是你想要的输出精度。 long double 的精度因平台而异,但您通常可以打赌它至少有 16 位小数精度。

编辑:虽然我并不完全同意其他人认为 fopen_s完全浪费时间的观点,但它确实代表了一个非常低的机会剥削并且没有得到广泛支持。然而,在 C4996 下警告的其他一些函数是更严重的漏洞,使用 _CRT_SECURE_NO_WARNINGS 相当于关闭“你没有锁卧室门”和“你离开了房间”的警报厨房里的核弹”。

只要您不限于在项目中使用“纯 C”(例如,用于学校作业或嵌入式微 Controller ),您最好利用几乎所有现代 C 编译器也是 C++ 编译器这一事实并使用所有这些 I/O 函数的 C++ iostream 变体,以同时提高安全性兼容性。

关于c - fopen/fopen_s 和写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2575116/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com