0

プロットのためにMatlabまたはGNUPlotにインポートできるように、浮動小数点数を含む1次元配列であるz1という変数をテキストファイルに出力しています。バイナリ ファイル (.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);
}   

3 つの質問があります。

  1. バイナリ ファイルはテキスト ファイルよりも本当にコンパクトですか?;

  2. はいの場合、配列 z1 の値をバイナリ ファイルに出力できるように、上記のコードを変更する方法を知りたいです。fprintf を fwrite に置き換える必要があることを読みました。私の出力ファイルには、dodo.dat には配列 z1 の値が含まれ、1 行に 1 つの浮動小数点数が含まれている必要があると書かれています。

  3. 私のコードには %.16Le が含まれていますが、長い倍精度で 15 桁の精度があるため、%.15Le は正しいと思います。幅の位置にドット (.) を入れました。これにより、任意のフィールドに拡張して目的の数値を保持できると考えています。私は正しいですか?%.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. 「w」の代わりに「wb」でファイルを開き、使用fwrite()します-ファイルに「行」がなくなりました-(バイナリ)浮動小数点値のストリームになります

  3. doubleと の間で混乱している可能性がありますlong double- a のlong 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 に答える