2016-10-06 15 views
1

バイナリファイルとそのバイナリファイルを読むことができるC++コードがあります。代替バイナリをC++の代わりにPythonで読む

int NumberOfWord; 
FILE *f = fopen("../data/vec.bin", "rb"); 
fscanf(f, "%d", &NumberOfWord); 
cout << NumberOfWord< <endl; 

この出力は次のとおりです。

114042 

は、私はPythonで上記のコードのように再実装します。

with open("../data/vec.bin","rb") as f: 
    b = f.read(8) 
    print struct.unpack("d",b)[0] 

しかし、このコードは機能しません。 私の出力は次のとおりです。

8.45476330511e-53 

私の質問は以下のとおりです。

1)整数はC++で8バイトを持っている理由。

%dは二重を意味することはありません。 しかし、実際には変数は整数型を持っていますが、通常はC++で "%d"を使用して出力します。 それは変です。

2)どのように私はPythonコードでC++コードを上記のような実数値を抽出したいのpython

で実数を抽出します。 どうすればいいですか?

多分、私はPythonの構造体モジュールについて誤解しています。

+1

ネブリルスの答えがあります。 Pythonの10進形式指定子も "d"であることを付け加えたいと思います。 'printf("%d "、42);'はPythonのprint( "{0:d}"%42)に対応します。 –

+1

私は飲んだか、 'fscanf(...、"%d "、)'は読み込み用です** text ** file ??? –

+0

ありがとうございます。 'fscanf(...、"%d "、)'は、この時点でバイナリファイルを読み込むためのものです。 –

答えて

0

C形式の文字列では、%dは10進数の略です。

Pythonでは、dはdoubleの略です。

整数の場合は、struct.unpackコールでiを使用する必要があります。

あなたはこのC++(あるいは、むしろC)で正しくファイルを読むことができたとして
with open("../data/vec.bin","rb") as f: 
    b = f.read() 
    print struct.unpack("i",b)[0] 
+0

ありがとう!私はその違いを知らない。 しかし、私はあなたのコードのように "私"を使って走った。 しかし、私のPython出力は808726833です。これはC++出力とは異なります。 ご存知ですか? –

+0

@田中博貴:コメントの中ですでに述べたように、あなたは** text **ファイルを非理性のバイナリ構造体として読み込もうとしています。 –

+0

@SergeBallesta: ありがとう。出来た。 C++コードとバイナリファイルは、他者が作成したものです。おそらく、私はバイナリとテキストを読むことの違いについて誤解しました。 –

1

ライン、fscanf(f, "%d", &NumberOfWord);、私はあなたのファイルが114042.のテキスト表現が含まれていると仮定だから、バイト

が含まれています0x31 0x31 0x34 0x30 0x34 0x32 ...または'1', '1', '4', '0', '4', '2', ...

テキストエディタで開くと、1行の114042が表示されます。

今、あなたはi形式のバイナリとして、あなたはファイルの最初の4つのバイトを使用して、実際にint('31313034', 16)を取得する場合読みしようとすると:825308208.私はあなたが私ので、二重としてそれを復号化するためd形式で何を得るの再現ができませんでした最後の数字の後にあなたのファイルに来るものを推測できませんでした...

数は、最初の行に一人である場合、それは簡単です:ちょうど1行を読んで、int型に変換します

with open("../data/vec.bin","rb") as f: 
    print int(f.readline()) 

他の文字は、最後の桁の後にある場合は、あなたが最初にする必要があります数値を取得し、int型に変換する(reをインポートすることを忘れないでください)正規表現を使用します。

with open("../data/vec.bin","rb") as f: 
    line = f.readline() 
    m = re.match(t'\s*\d*', line) 
    print(int(m.group(0))) 

TL/DR:それはバイナリ表現が含まれているかのようテキストファイルを読み取るしようとしないでください

+0

丁寧な答えをありがとう。 問題の内容を理解しています。 データファイルにはテキストとバイナリが含まれているため、おそらくデータファイルが奇妙です。 –

+0

バイナリとテキストioを混在させることは、PythonではCよりもはるかに難しいです。なぜなら、テキスト読み込み後にファイルの位置を取得する手段がないからです。つまり、Pythonライブラリは完全なバッファを読み込み、ファイルポインタは通常行末をはるかに超えています。あなたは、(別の質問ではIMHO)読んでみたいファイルの構造を説明してください。 –

関連する問題