我正在打印一个变量 z1,它是一个包含浮点数的一维数组到一个文本文件,以便我可以导入 Matlab 或 GNPlot 进行绘图。我听说二进制文件 (.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.0047914240730432e-002 这样的输出,它给了我 16 个精度数字,并且字段的宽度具有正确的宽度以正确显示数字。在宽度位置而不是宽度值中放置一个点 (.) 是一种好习惯吗?
非常感谢...
更新正在更改为:
for(i = 0; i < z_size; i++)
fwrite(&z1, sizeof(long double), 1, out);
除了更改为“wb+”还可以吗?我无法在 Matlab 中读取二进制文件。