二进制文件大小不一致(C / C ++)

时间:2013-11-15 04:35:41

标签: c++ c double binaryfiles

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

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。

1 个答案:

答案 0 :(得分:6)

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

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

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