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

时间:2018-08-24 04:32:52

标签: c printf filenames multiple-files

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

4 个答案:

答案 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);

那样将输出数组中第一个条目的内容。