0

我正在打印一个变量 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);
}   

我有三个问题:

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

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

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

非常感谢...

更新正在更改为:

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

除了更改为“wb+”还可以吗?我无法在 Matlab 中读取二进制文件。

4

1 回答 1

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

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

  3. 您可能会在double和之间感到困惑long double- along double的大小最多可达 16 个字节,精度可达 32 位左右(但这取决于实现 - long double 通常可以是 10、12 或 16 个字节)。Adouble通常为 8 个字节,精度约为 16 位。

MATLAB 可能无法应对long double(因为它没有很好地标准化)所以你可能只想将双精度写入你的数据文件,例如

for (i = 0; i < z_size; i++)
{
    double z = (double)z1[i];
    fwrite(&z, sizeof(double), 1, out);
}
于 2010-04-06T10:20:18.947 回答