我想保存多个.dat文件,但发出警告:“格式'%f'期望类型为'double'的参数,但参数3的类型为'double *'[-Wformat =]”,文件出来空的。
FILE *f1;
double hist[N];
double delta_t = 0.25;
int n_periodos = 0;
char name[100];
sprintf(name,"testeT%f.dat",n_periodos*delta_t);
f1 = fopen (name,"w");
fprintf(f1,"%lf",hist); //The problem is here
答案 0 :(得分:2)
最后一行的问题是您将hist
(这是一个双精度数组)传递给fprintf
,在这里您使用了%lf
转换说明符,它期望一个double
作为其参数(不是 double数组)
在C中声明数组时,在访问时,该数组将转换为指向数组C11 Standard - 6.3.2.1 Lvalues, arrays, and function designators(p3)中第一个元素的指针。 (在此处说明了例外情况-与sizeof
,_Alignof
或一元&
一元运算符一起使用时,或者在用字符串常量初始化时)其中的一些适用于这里。
因此,您声明:
double hist[N];
hist
是双精度数组。在以下情况下使用hist
时:
fprintf (f1, "%lf", hist);
hist
会转换为指向数组中第一个元素的指针(例如,第一个元素的 地址),其类型为'double*'
。要解决此问题,您需要取消引用指针(通常通过在变量之后使用[element]
对数组进行操作,例如
fprintf (f1, "%lf", hist[0]); /* or element 1, 2, 3, .... */
这将使您的类型保持一致。
您可以重写代码(以至于仍然不清楚N
是什么),以消除该问题并纠正其他缺陷(在下面的注释中指出)
#include <stdio.h>
#define MAXC 100 /* if you need a constant, #define on (or more) */
#define NHIST 32 /* it is unclear where N came from in your code */
int main (void) {
FILE *f1 = NULL; /* initialize all variables and help */
double hist[NHIST] = {0.0}; /* avoid Undefined Behavior :) */
double delta_t = 0.25;
int n_periodos = 0;
char name[MAXC] = "";
/* use snprintf to protect the bounds of 'name' */
snprintf (name, MAXC - 1, "testeT%f.dat", n_periodos*delta_t);
f1 = fopen (name, "w"); /* call fopen */
if (f1 == NULL) { /* validate file is open for writing */
perror ("fopen-name");
return 1;
}
fprintf (f1, "%lf", hist[0]);
}
仔细检查一下,如果还有其他问题,请告诉我。
答案 1 :(得分:1)
调用运行时函数时,重要的是检查返回值以查看它们是否成功。
要记住的另一件事是,float和double并不是精确的值,因此将它们用作文件名的一部分是不好的。
所以请检查返回值
f1 = fopen(name, "w");
if (f1 != NULL)
{
...
fclose(f1);
}
else
{
perror(name); // or write out the error
}
还请注意,如果在函数中声明变量,则声明的变量不是必需的0,它们可以具有任意值,因此您需要对其进行初始化
double hist[N] = {0};
当您将hist []写入文件时,您不能像这样使用fprintf,您应该循环遍历一次将它们写入一个值的值,fprintf无法像您编写的那样处理数组。
for (int i = 0; i < N; ++i)
{
fprintf(f1, "%lf\n", hist[i]); // added \n as delimiter
}
答案 2 :(得分:1)
hist
是一个double数组(或者从技术上讲,指针double*
传递到fprintf中),但是您试图将一个double值写入文件,而不是数组。您可能想要这样写整个数组:
for (int i = 0; i < N; i++)
{
fprintf(f1, "%f", hist[i]);
}
或者只是一个值:
fprintf(f1, "%f", hist[0]);
此外,在示例代码中,hist
是未初始化的数组。写入文件的内容可能不会达到您的期望。
答案 3 :(得分:0)
关于:
years = [year for index, year in enumerate((start_year, end_year))
if index == 0 or start_year != end_year]
在C中,表示对数组名称的引用“降级”为数组第一个字节的地址。
更好用:
fprintf(f1,"%lf",hist);
那样将输出数组中第一个条目的内容。