2016-05-28 9 views
1

Ich möchte mit C++ eine Reihe von Zahlen in einer Binärdatei speichern, um sie später mit Python zu öffnen. Zur Zeit habe ich das folgende Skript in C++ namens * writer.cpp:Binär in C++ schreiben und Python einlesen

#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; 
} 

die, wenn sie als

g++ -o writerTest.x writer.cpp 

kompilieren und laufen als

./writerTest.x 

eine binäre Datei mit dem Namen „binaryFile erzeugen. Behälter".

Ich versuche dann mit dem folgenden Skript namens reader.py dies mit Python zu lesen:

import numpy as np 
from sys import argv 

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

Lauf dies als Python reader.py binaryFile.bin folgendes Ergebnis

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

Was offensichtlich nicht das war, was ich mir erhofft hatte. Was mache ich falsch und wie soll das richtig gemacht werden?

+0

Sie können nicht einfach in eine Datei schreiben und schreiben, Sie müssen Ihre Daten in ein bekanntes Format (ein existierendes oder ein selbst erstelltes Format) serialisieren. – spectras

+0

Sie schreiben ganze Zahlen und lesen Floats, die nicht funktionieren können. (Binär) –

+0

@spectras: In der Praxis wird der OP-Code in den meisten Fällen wahrscheinlich unter der Annahme eines nicht zu aggressiven Optimierers und einer "vernünftigen" Plattform funktionieren. Theoretisch musst du das Ding in eine Reihe von Charakteren maskieren und rekonstruieren, aber meh. – Kevin

Antwort

2

fromfile nimmt Gleitkommazahlen standardmäßig an. Wenn Sie dieses Verhalten ändern möchten, müssen Sie den Typ im angegebenen Parameter dtype übergeben.

Wie Sie Ints schreiben, diese sollte Arbeit:

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

Sie haben die Art der Werte angeben, Sie lesen zu gehen, hat numpy keine Möglichkeit, dass es zu erraten Es sind keine Metadaten in der Datei selbst gespeichert. Also in Ihrem Fall, dass Sie etwas zu tun haben, wie:

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

Wenn Sie Dinge wie dies zu tun, ist es sehr empfehlenswert mit fester Größe ganze Zahlen zu verwenden, anstatt nur int, z.B. In C++ können Sie int32_t von <cstdint> verwenden und in Python können Sie int32 als dtype angeben.

+1

Dies und Sie sollten auch die Byte-Reihenfolge angeben. Auf beiden Seiten. – spectras

+0

Danke! musste dtype = np.int32 angeben. Lief wie am Schnürchen. [0 1 3 6 10 15 21 28 36 45] ein – filiphl