在C中的fprintf上保存多个不同名称的文件

在C中的fprintf上保存多个不同名称的文件,c,printf,filenames,C,Printf,Filenames,我想保存多个.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,"

我想保存多个.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

调用运行时函数时,检查返回值以查看它们是否成功很重要

要记住的另一件事是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
}
for(int i=0;i
hist
是一个双精度数组(或者从技术上讲是一个指针,
double*
,当它传递到fprintf时),但您试图将一个双精度值写入文件,而不是数组。您可能需要这样的内容来编写整个数组:

for (int i = 0; i < N; i++)
{
    fprintf(f1, "%f", hist[i]);
}

另外,在示例代码中,
hist
是一个未初始化的数组。写入文件的内容可能不是您所期望的。

最后一行的问题是,您正在将
hist
(一个double数组)传递到
fprintf
,在这里您使用了
%lf
转换说明符,该说明符需要一个
double
作为其参数(不是double数组)

在C中声明数组时,在访问时,该数组将转换为指向数组中第一个元素的指针。(此处说明了例外情况——与
sizeof
\u Alignof
一起使用时,或与一元
&
运算符一起使用时,或使用字符串文字初始化时)这些情况均不适用于此处

因此,你宣布:

double hist[N];

hist
是一个双精度数组。在中使用
hist
时:

fprintf (f1, "%lf", hist);
hist
被转换为指向数组中第一个元素(例如第一个元素的地址)的指针,该元素的类型为
'double*'
。要更正此问题,您需要取消对指针的引用(通常使用变量后面的
[element]
对数组执行,例如

fprintf (f1, "%lf", hist[0]);  /* or element 1, 2, 3, .... */
这将使您的类型一致

您可以重写代码(虽然仍不清楚
N
是什么),以消除问题并纠正其他一些缺点(在下面的评论中确定)

#包括
#定义MAXC 100/*如果您需要一个常量,请#定义on(或更多)*/
#定义NHIST 32/*不清楚N在代码中的来源*/
内部主(空){
文件*f1=NULL;/*初始化所有变量和帮助*/
双历史[NHIST]={0.0};/*避免未定义的行为:)*/
双增量t=0.25;
int n_periodos=0;
字符名[MAXC]=“”;
/*使用snprintf保护“name”的边界*/
snprintf(名称,MAXC-1,“测试%f.dat”,n_periodos*delta_t);
f1=fopen(名称,“w”);/*呼叫fopen*/
如果(f1==NULL){/*则验证文件已打开以进行写入*/
佩罗尔(“福彭名称”);
返回1;
}
fprintf(f1,“%lf”,hist[0]);
}
仔细检查一下,如果您还有其他问题,请告诉我。

关于:

fprintf(f1,"%lf",hist);
在C语言中,对数组名称的引用“降级”为数组第一个字节的地址

更好地使用:

fprintf(f1,"%lf",hist[0]);

因为这将输出数组中第一个条目的内容。

尝试在
hist
中选择一个索引,该索引是指向
双精度数组的指针(尽管您需要先添加一些内容)。
hist
是双精度数组(例如
double-hist[N];
)当您将
hist
作为参数传递给
fprintf
时,它将转换为第一个元素(例如
&hist[0]
,它是
'double*”
)的地址。问题是关于编译时的问题。但是发布的代码只是一个小笑话!请发布一个日志,以便我们可以重现问题,以便我们可以帮助您调试。\OT:调用
fopen()
时,始终检查(!=NULL)返回值以确保操作成功。如果未成功,请调用
perror(“您的错误消息”)
,因为这将打印您的错误消息以及系统认为函数失败的文本原因。关于:
double hist[NHIST]={0}
这是将
double
s数组初始化为
int
值。建议:
double hist[NHIST]={0.0}
很公平,即使
{0}
是一个通用的初始值设定项,将类型与初始值设定项的内容匹配也没有什么错。
fprintf(f1,"%lf",hist);
fprintf(f1,"%lf",hist[0]);