我正在打印一个变量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);
}
我有三个问题:
二进制文件真的比文本文件更紧凑吗?
如果是,我想知道如何修改上面的代码,以便我可以将数组z1的值打印到二进制文件中。我已经读过fprintf必须用fwrite替换。我的输出文件说dodo.dat应该包含数组z1的值,每行有一个浮点数。
我的代码中有%。16Le,但我认为%。15Le是正确的,因为我有15个精确数字和long double。我在宽度位置放了一个点(。)因为我认为这允许扩展到任意字段以保持所需的数字。我对吗?作为%。16Le的示例,我可以输出类似1.0047914240730432e-002的输出,它给出了16个精确数字,并且字段的宽度具有正确的宽度以正确显示数字。将点(。)放在宽度位置而不是宽度值是一个好习惯吗?
非常感谢...
更新正在更改为:
for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);
确定除了改为“wb +”之外?我无法在Matlab中读取二进制文件。
答案 0 :(得分:0)
是的,二进制文件更紧凑,但是你失去了可移植性,还有其他各种潜在的问题,所以除非你的数据文件有问题,或导出/导入速度慢,否则坚持使用文本,如果可以的话(您可以随时压缩它们进行存储,例如使用zip)
使用“wb”而不是“w”打开文件并使用fwrite()
- 您的文件中不再有“行” - 它只是(二进制)浮点值的流
您可能会在double
和long double
之间感到困惑 - long double
最大可达16个字节,精度最高可达32位左右(但是这是依赖于实现的 - long double通常可以是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);
}