6

AC プログラムは、連続する double をバイナリ ファイルに吐き出します。それらをPythonに読み込みたい。使ってみたstruct.unpack('d',f.read(8))

編集:Cで次を使用して、ランダムな倍精度数を記述しました

r = drand48();
fwrite((void*)&r, sizeof(double), 1, data);

エラーは修正されましたが、最初の値を読み取ることができません。すべて 0.000.. の場合は 3.90798504668055 と表示されますが、残りは問題ありません。

4

5 に答える 5

1

「うまくいかなかった」について詳しく教えてください。コマンドがクラッシュしましたか? 出てきたデータは間違っていませんか?実際に何が起こったのですか?

コマンドがクラッシュした場合:

  • コマンドのエラー出力を共有してください

データが単に間違っている場合:

  • データを作成および読み取るシステムのエンディアンは同じですか? 1 つがビッグ エンディアンで、もう 1 つがリトル エンディアンの場合、フォーマット文字列でエンディアン変換を指定する必要があります。

  • 2 台のコンピューターのエンディアンが同じ場合、データはどのようにファイルに書き込まれたのでしょう? あなたは知っていますか?もしそうなら、ファイルに書き込まれた値と間違った値は何でしたか?

于 2009-03-10T18:24:38.253 に答える
0

最良の方法は、ASCII テキスト ファイルを使用することです。

0.0
3.1416
3.90798504668055

移植性があり、あらゆる種類の浮動小数点実装である程度動作するという点で。

のメモリ アドレスからの生のバイナリ データの読み取りdoubleは移植性がまったくなく、別の実装では必ず失敗します。

もちろん、コンパクトにするためにバイナリ形式を使用することもできますが、その形式で記述した移植可能な C 関数は、スニペットのようには見えません。

少なくとも、コードはdouble、現在のマシンで使用されている s のメモリ表現が Python インタープリターで期待されるものと正確に一致することを確認する一連の ifs/ifdefs で囲まれている必要があります。

そのようなコードを書くのは難しいでしょう。そのため、簡単でクリーンで、移植可能で、人間が判読できる ASCII テキストのソリューションを提案しています。

これがの「最高」の定義です。

于 2009-03-10T22:29:12.160 に答える
0
  • f.read(8)8バイト未満を返す可能性があります
  • データの配置やエンディアンが異なる場合があります。

    >>> for c in '@=<>':
    ...     print repr(struct.pack(c+'d', -1.05))
    ...
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xcd\xcc\xcc\xcc\xcc\xcc\xf0\xbf'
    '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd'
    >>> struct.unpack('<d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
    (-6.0659880001157799e+066,)
    >>> struct.unpack('>d', '\xbf\xf0\xcc\xcc\xcc\xcc\xcc\xcd')
    (-1.05,)
    
于 2009-03-10T18:56:14.497 に答える