二进制文件的大小不一致,双精度 (C/C++)

Inconsistent size of binary file with doubles (C/C++)

本文关键字:C++ 双精度 不一致 二进制文件      更新时间:2023-10-16

我在将双精度数组写入和读取二进制文件时遇到问题。在某些情况下,文件大小大于预期。以下代码:

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("%fn", arr[i]);
    }
    fwrite(arr, sizeof(double), size, fid);
    free(arr);
    fclose(fid);
    printf("nn");
    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("%fn", 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。

由于您正在使用二进制数据,因此可能需要为文件操作指定二进制模式:

FILE *fid = fopen("C:\Group0\Night0\Imanti\test.dat", "wb");
fid = fopen("C:\Group0\Night0\Imanti\test.dat", "rb");