2016-05-28 6 views
1

私は、後でpythonを使って開くために、C++を使って一連の数値をバイナリファイルに保存したいと思います。現在、私はC++の名前* writer.cppで次のスクリプトを持っている:C++でバイナリを書いて、Pythonで読む

g++ -o writerTest.x writer.cpp 

としてコンパイル

#include <fstream> 

int main() 
{ 
    std::ofstream outFile; 
    outFile.open("binaryFile.bin", std::ios::binary); 
    int number = 0; 
    for (int i=0; i<10; i++){ 
    number += i; 
    outFile.write(reinterpret_cast<const char*>(&number), sizeof(int)); 
    } 
    outFile.close(); 

    return 0; 
} 

./writerTest.x 

として実行「binaryFileという名前のバイナリファイルを生成します。ビン "。

私はその後、名前の次のスクリプトを使用してこの使用のpython reader.py読み取ろう:

import numpy as np 
from sys import argv 

path = str(argv[1]) 
x = np.fromfile(path) 
print x, type(x) 

PythonはbinaryFile.bin は、次のような結果が生成さreader.pyとしてこれを実行し

[ 2.12199579e-314 1.27319747e-313 3.18299369e-313 5.94158822e-313 
9.54898106e-313] <type 'numpy.ndarray'> 

これは明らかに私が望んでいたものではありません。私は間違って何をしていますか、これはどうやって正しく行われるべきですか?

+0

ファイルをキャストして書き込むことはできません。データを既知の形式(既存の形式または自分で作成した形式)にシリアル化する必要があります。 – spectras

+0

整数や浮動小数点数を書いていますが、動作できません。 (バイナリ) –

+0

@spectras:実際には、過度に攻撃的ではなく、「合理的」なプラットフォームではないオプティマイザを想定すると、OPのコードはほとんどの場合有効です。理論的には、文字をビットマスクして一連の文字に再構成する必要があります。 – Kevin

答えて

2

fromfileは、デフォルトで浮動小数点数を仮定します。この動作を変更する場合は、名前付きパラメータdtypeの型を渡す必要があります。

あなたはint型を書いているように、このはず作品:

x = np.fromfile(path, dtype=int) 
2

あなたが読んでしようとしている値の型を指定する必要があり、numpyがなどがあることを推測する方法がありませんファイル自体にメタデータが格納されていません。だからあなたの場合にはあなたのような何かをする必要があります:

x = np.fromfile(path, dtype=int) 

あなたはこのようなことをやっている場合、非常に固定サイズの整数だけではなくint、例えばを使用することをお勧めしますC++では<cstdint>int32_tを使用でき、Pythonではdtypeとしてint32を指定できます。

+1

これまた、バイトオーダーを指定する必要があります。両側に。 – spectras

+0

ありがとう! dtype = np.int32を指定する必要がありました。魅力のように働いた。 [0 1 3 6 10 15 21 28 36 45] <タイプ 'numpy.ndarray'> – filiphl

関連する問題