我在编写和读取二进制文件中的双精度数组时遇到了问题。在某些情况下,文件的大小大于预期。以下代码:
int main()
{
int i, j, size=13;
FILE *fid = fopen("C:\\Group0\\Night0\\Imanti\\test.dat", "w");
double *arr = (double *)malloc(sizeof(double)* size);
for (i = 0; i < size; i++) {
arr[i] = size / (i + 1.0);
printf("%f\n", arr[i]);
}
fwrite(arr, sizeof(double), size, fid);
free(arr);
fclose(fid);
printf("\n\n");
fid = fopen("C:\\Group0\\Night0\\Imanti\\test.dat", "r");
arr = (double *)malloc(sizeof(double)* size);
fread(arr, sizeof(double), size, fid);
for (i = 0; i < size; i++) {
printf("%f\n", arr[i]);
}
free(arr);
fclose(fid);
return 0;
}
显示了我的问题的一个简单示例。如果我使用例如size = 10
运行它,则文件的大小为80字节,并且写入和读取时的数字相同。如果我用size = 13
运行它,文件的大小是105字节(当它应该是104字节)并且数字完全不同。 size = 13
案例的输出是:
13.000000
6.500000
4.333333
3.250000
2.600000
2.166667
1.857143
1.625000
1.444444
1.300000
1.181818
1.083333
1.000000
13.000000
-6108112916776316800000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
-6277438562204192500000000000000000000000000000000000000000000000000.000000
使用额外字节写入第一个数字(13)或第二个数字(6.5),导致文件更大并且读取失败。我知道双重表示会导致精度错误,但据我所知,这与精度不同,文件中双变量的大小也在变化。
我不确定我是否遗漏了一些非常明显的东西,但它已经让我疯狂了。我在i7计算机上使用vs2013。
答案 0 :(得分:6)
由于您正在使用二进制数据,因此可能需要为文件操作指定二进制模式:
FILE *fid = fopen("C:\\Group0\\Night0\\Imanti\\test.dat", "wb");
fid = fopen("C:\\Group0\\Night0\\Imanti\\test.dat", "rb");