我正在打印一个变量SAID Z1,它是一个1-D数组,其中包含浮点数为文本文件,以便我可以将其导入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个精度数字,长双倍。我已经将一个点(。)放在宽度位置,因为我相信这允许扩展到任意字段以保持所需的数字。我对吗?作为%.16LE的示例,我可以拥有一个输出,例如1.004791424240730432E-002,它为我提供了16个精度数字,并且该字段的宽度具有正确的宽度,可以正确显示该数字。将点(。)放置在宽度位置而不是宽度值的好习惯?

非常感谢...

更新 正在更改为:

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

还可以更改为“ WB+”吗?我无法阅读MATLAB中的二进制文件。

有帮助吗?

解决方案

  1. 是的,二进制文件更紧凑,但是您会失去可移植性,并且还有其他各种潜在问题,因此,除非您的数据文件在问题上是巨大的,或者导出/导入速度慢,那么请坚持文本是一个好主意(您可以(您)总是可以压缩它们以进行存储,例如用zip)

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

  3. 您可能会感到困惑 doublelong double - 一个 long double 大小的最高可达16个字节,并且精度约为32位数字(但这取决于实现 - 长双重可以是10、12或16个字节)。一个 double 通常为8个字节,精度约为16位。

MATLAB可能无法应付 long double (由于不是很好的标准化),因此您可能只想将双打写成数据文件,例如

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top