Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将双精度数组写入文件时出现问题_C_File Io_Printf - Fatal编程技术网

C 将双精度数组写入文件时出现问题

C 将双精度数组写入文件时出现问题,c,file-io,printf,C,File Io,Printf,我有一个非常大的双精度数字数组…我试图使用fprintf()将其写入一个文件…我需要在每行中写入一个数字,所以我做了类似的操作 if((fp2 = fopen("temp", "w")) == NULL) { perror("File cannot be opened"); exit(1); } for(int k = 0; k < j; k++ ) { fprintf(fp2, "%0.3lf\n", diff[k]); } 我真的不明白是什么问题。为什么当数组中有值时,它会将所

我有一个非常大的双精度数字数组…我试图使用fprintf()将其写入一个文件…我需要在每行中写入一个数字,所以我做了类似的操作

if((fp2 = fopen("temp", "w")) == NULL) { perror("File cannot be opened"); exit(1); }

for(int k = 0; k < j; k++ )
{
fprintf(fp2, "%0.3lf\n", diff[k]);  
}
我真的不明白是什么问题。为什么当数组中有值时,它会将所有值都写为0.000

下面是diff是如何实现的,如果它有帮助的话

            diff = (double *)malloc(fileSize);

        diff[0] = data[0];


        for(j = 1; j < n; j++ )
        {
            diff[j] = data[j] - data[j-1];
        }
diff=(双*)malloc(文件大小);
差异[0]=数据[0];
对于(j=1;j

文件中的值存储在数据[]中。然后,我将data[]中相邻值的差值计算到diff[]中,并将其写回另一个文件。fileSize是原始文件的大小。我确信diff[]中的所有值都已正确填充。

这可能是因为您已通过
memset
或类似方式将数组初始化为零,即
0.0
。当迭代数组时,它会在偏移量中引入一个值,该值为零(可能是您过度分配/过度估计了数组的大小)

如果((fp2=fopen(“temp”,“wt”))==NULL){ perror(“文件无法打开”); 出口(1); } 对于(int k=0;k0.0)fprintf(fp2,“%0.3lf\n”,diff[k]); } 我添加了一个额外的逻辑来检查数组指定偏移量中的值是否大于零,以便将其放入文件中

另外,当您在
fopen(…)
函数中指定访问模式的类型时,它默认为二进制。实际上,指定文本模式应该是t,如上所示

希望这有帮助, 顺致敬意,
Tom.

可能是您通过
memset
或类似方式将数组初始化为零,即
0.0
。当迭代数组时,它会在偏移量中引入一个值,该值为零(可能是您过度分配/过度估计了数组的大小)

如果((fp2=fopen(“temp”,“wt”))==NULL){ perror(“文件无法打开”); 出口(1); } 对于(int k=0;k0.0)fprintf(fp2,“%0.3lf\n”,diff[k]); } 我添加了一个额外的逻辑来检查数组指定偏移量中的值是否大于零,以便将其放入文件中

另外,当您在
fopen(…)
函数中指定访问模式的类型时,它默认为二进制。实际上,指定文本模式应该是t,如上所示

希望这有帮助, 顺致敬意,
Tom.

打印双精度值的正确转换说明符是
%f
,而不是
%lf

C99未指定
%lf
接受的内容。您的实现可能会提供
%lf
作为
长双精度
等的扩展,但您需要将变量类型与转换说明符匹配。检查编译器的文档

如果您有长双精度
,正确的C99转换说明符是
%Lf


编辑,在问题被编辑之后


打印双精度值的正确转换说明符是
%f
,而不是
%lf

C99未指定
%lf
接受的内容。您的实现可能会提供
%lf
作为
长双精度
等的扩展,但您需要将变量类型与转换说明符匹配。检查编译器的文档

如果您有长双精度,正确的C99转换说明符是
%Lf


编辑,在问题被编辑之后


在评论之后添加以下内容作为正式答复:

您有以下行:


diff = (double *)malloc(fileSize);
请注意,当您
malloc(fileSize)
时,您正在内存中分配fileSize字节。每个double占用8个字节(或多或少取决于平台),因此数组中有fileSize/8个元素。您确定n永远不会超过数组中的元素数吗


程序可以使用
printf
而不能使用
fprintf
正常工作的原因是内存错误非常微妙。如果你开始使用你没有分配的内存,那么在短时间内一切都会好起来,但是当程序的另一部分相当合理地决定开始使用你已经顽皮地使用的内存时,事情就会失控。

在评论后添加官方答案:

您有以下行:


diff = (double *)malloc(fileSize);
请注意,当您
malloc(fileSize)
时,您正在内存中分配fileSize字节。每个double占用8个字节(或多或少取决于平台),因此数组中有fileSize/8个元素。您确定n永远不会超过数组中的元素数吗


程序可以使用
printf
而不能使用
fprintf
正常工作的原因是内存错误非常微妙。如果你开始使用你没有分配的内存,那么在短时间内一切都会好起来,但是当程序的另一部分相当合理地决定开始使用你已经在调皮地使用的内存时,事情就会失控。

如果你只想打印第一个值以及连续值之间的差异,为什么要用差分数组呢?为什么不用简单的方法呢

fprintf(fp2, "%Lf\n", data[0]);
for(j = 1; j < n; j++ )
{
  fprintf(fp2, "%Lf\n", data[j] - data[j-1]);
}
fprintf(fp2,“%Lf\n”,数据[0]);
对于(j=1;j

正如另一个人指出的,你的malloc()可能是伪造的,这就是让你感到困惑的地方。

如果你只想打印第一个值以及连续值之间的差异,为什么还要麻烦使用差异数组呢?为什么不用简单的方法呢

fprintf(fp2, "%Lf\n", data[0]);
for(j = 1; j < n; j++ )
{
  fprintf(fp2, "%Lf\n", data[j] - data[j-1]);
}
fprintf(fp2,“%Lf\n”,数据[0]);
对于(j=1;j
正如另一个人所指出的,你的malloc()可能是伪造的,这是错误的

diff = (double *)malloc(fileSize);
fprintf(fp2, "%Lf\n", data[0]);
for(j = 1; j < n; j++ )
{
  fprintf(fp2, "%Lf\n", data[j] - data[j-1]);
}