二进制文件打印和所需的精度
-
24-09-2019 - |
题
我正在打印一个变量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);
}
我有三个问题:
二进制文件真的比文本文件更紧凑吗?
如果是,我想知道如何修改上述代码,以便我可以将数组Z1的值打印到二进制文件。我读过,FPRINTF必须被FWRITE替换。我的输出文件说dodo.dat应该包含每行浮动数量的数组z1的值。
我的代码中有%.16LE,但我认为%.15LE是正确的,因为我有15个精度数字,长双倍。我已经将一个点(。)放在宽度位置,因为我相信这允许扩展到任意字段以保持所需的数字。我对吗?作为%.16LE的示例,我可以拥有一个输出,例如1.004791424240730432E-002,它为我提供了16个精度数字,并且该字段的宽度具有正确的宽度,可以正确显示该数字。将点(。)放置在宽度位置而不是宽度值的好习惯?
非常感谢...
更新 正在更改为:
for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);
还可以更改为“ WB+”吗?我无法阅读MATLAB中的二进制文件。
解决方案
是的,二进制文件更紧凑,但是您会失去可移植性,并且还有其他各种潜在问题,因此,除非您的数据文件在问题上是巨大的,或者导出/导入速度慢,那么请坚持文本是一个好主意(您可以(您)总是可以压缩它们以进行存储,例如用zip)
用“ WB”而不是“ W”打开您的文件并使用
fwrite()
- 您的文件中不再有“线” - 它将只是(二进制)浮点值的流您可能会感到困惑
double
和long 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);
}