二进制文件打印和所需的精度

时间:2010-04-05 22:53:32

标签: file binary double precision long-double

我正在打印一个变量say z1,它是一个包含浮点数的一维数组到文本文件,以便我可以导入到Matlab或GNUPlot中进行绘图。我听说二进制文件(.dat)小于.txt文件。我目前用于打印到.txt文件的定义是:

void create_out_file(const char *file_name, const long double *z1, size_t z_size){
FILE *out;
size_t i;
 if((out = _fsopen(file_name, "w+", _SH_DENYWR)) == NULL){
 fprintf(stderr, "***> Open error on output file %s", file_name);
 exit(-1);
 }
for(i = 0; i < z_size; i++)
fprintf(out, "%.16Le\n", z1[i]);
fclose(out);
}   

我有三个问题:

  1. 二进制文件真的比文本文件更紧凑吗?

  2. 如果是,我想知道如何修改上面的代码,以便我可以将数组z1的值打印到二进制文件中。我已经读过fprintf必须用fwrite替换。我的输出文件说dodo.dat应该包含数组z1的值,每行有一个浮点数。

  3. 我的代码中有%。16Le,但我认为%。15Le是正确的,因为我有15个精确数字和long double。我在宽度位置放了一个点(。)因为我认为这允许扩展到任意字段以保持所需的数字。我对吗?作为%。16Le的示例,我可以输出类似1.0047914240730432e-002的输出,它给出了16个精确数字,并且字段的宽度具有正确的宽度以正确显示数字。将点(。)放在宽度位置而不是宽度值是一个好习惯吗?

  4. 非常感谢...

    更新正在更改为:

    for(i = 0; i < z_size; i++)
    fwrite(&z1, sizeof(long double), 1, out);
    

    确定除了改为“wb +”之外?我无法在Matlab中读取二进制文件。

1 个答案:

答案 0 :(得分:0)

  1. 是的,二进制文件更紧凑,但是你失去了可移植性,还有其他各种潜在的问题,所以除非你的数据文件有问题,或导出/导入速度慢,否则坚持使用文本,如果可以的话(您可以随时压缩它们进行存储,例如使用zip)

  2. 使用“wb”而不是“w”打开文件并使用fwrite() - 您的文件中不再有“行” - 它只是(二进制)浮点值的流

  3. 您可能会在doublelong double之间感到困惑 - long double最大可达16个字节,精度最高可达32位左右(但是这是依赖于实现的 - long double通常可以是10,12或16个字节。 double通常为8个字节,精度约为16位。

  4. MATLAB可能无法应对long double(因为它没有很好地标准化),因此您可能只想将双打写入数据文件,例如

    for (i = 0; i < z_size; i++)
    {
        double z = (double)z1[i];
        fwrite(&z, sizeof(double), 1, out);
    }