2016-11-22 3 views
0

Ich brauche deine Hilfe noch einmal für das Speichern und Lesen von Daten im Binärformat. Ich habe ein vector<<complex> > xy(256), die von der Hardware in 10 mal gelesen wird:Wie binäre Daten speichern und lesen?

vector<<complex> > xy(256); 
ofstream outfile2 (outfilename2.c_str() , ofstream::binary); 
.... 
.... 
for(unsigned t = 0; t < 10; t++) 
{ 
    .... 
    .... 
    for(unsigned i = 0; i < 256; i++) 
    { 
      xy[i] = f[i] * conj(g[i]); 
    } 
    for(unsigned i = 0; i < 256; i++) 
    { 
      outfile2 << boost::format("%20.8e") % xy[i]<< endl; // write in text 
    } 
} // the text data will be 2560 lines of complex data, for example: 
    // (6.69635350e+06,7.34146150e+06) 

Jetzt versuche ich, in binäre Datei zu speichern, diesen Befehl:

for(unsigned i = 0; i < 256; i++) 
    { 
     outfile2.write((const char*)& xy[i], 1 * sizeof(complex<short>)); 
     outfile2.flush(); 
    } 

Obwohl es mir noch geben a Daten, aber wenn ich mit den Originaltextdaten vergleiche, waren sie unterschiedlich. Ich verstehe nicht warum?

Ich möchte komplexe 16 mit Fließkommadaten lesen.

Ich hoffe, dass Sie helfen können.

Vielen Dank.

+0

@Sergey Sergey Ich hoffe, Sie können mir bei dieser Frage helfen, ich bin immer noch auf den Binärdaten verwirrend. Vielen Dank. –

+2

* "wenn ich mit den ursprünglichen Textdaten vergleiche, waren sie anders" * anders wie? Bitte posten Sie die Beispielausgabe (plus was Sie erwartet haben). auch wie vergleichen Sie es? – UnholySheep

+0

& xy [i] vielleicht Sinn haben, vielleicht nicht. Vektor ist kein klassisches C-Array. und Indexierungsoperator wird "emuliert" –

Antwort

0

Ich habe eine Demo geschrieben, die auf meinem Computer funktioniert.

#include <cassert> 

#include <complex> 
#include <fstream> 
#include <iostream> 
#include <type_traits> 
#include <vector> 

int main() { 
    assert(std::is_trivially_copy_assignable<std::complex<short> >::value); 

    std::vector<std::complex<short> > vtr(256); 
    for (int i=0; i<256; ++i) 
    vtr[i] = std::complex<short>(i*2,i*2+1); 

    { 
    std::ofstream output("data.bin", std::ofstream::binary); 
    for (int i=0; i<256; ++i) 
     output.write((char *)&vtr[i],sizeof(vtr[i])); 
    } 
    vtr.clear(); 

    std::cout << vtr.size() << std::endl; 

    vtr.resize(256); 
    { 
    std::ifstream input("data.bin", std::ifstream::binary); 
    for (int i=0; i<256; ++i) 
     input.read((char *)&vtr[i],sizeof(vtr[i])); 
    } 

    for (size_t i=0; i<vtr.size(); ++i) 
    std::cout << vtr[i] << " "; 
    std::cout << std::endl; 

    return 0; 
} 

Sie können diese Demo auf Ihrem Computer ausführen. Wenn diese Demo funktioniert, haben Sie wahrscheinlich einige Fehler in Ihrem Code gemacht. Bitte geben Sie ein vollständiges und überprüfbares Beispiel an.

+0

hi felix, Ich versuche, Ihre Codes zu verwenden, es hat mit der Probe gearbeitet, als ich Vektorkomplex erstellt (0,1) (2,3) (4,5) (6,7) (8,9) ... Aber wenn ich versuche, diese Daten zu bekommen: (1.11122130e + 07,1.92728450e + 06) (2.92449620e + 07,150776630e + 07) (9.36541200e + 07,5.38220040e + 07) (2.16838928e + 08), 1.09020568e + 08) ... es gab mir die abweichende Nummer: (-18123,19347) (- 28519,19272) (- 14506,19421) (27752,19550) ... ich glaube nicht, dass ich das richtige gesammelt habe Daten, sogar ich benutze Matlab zum Plotten, sie sind sehr unterschiedlich. Ich schätze, die Daten, die ich zu bekommen versuche, sind hohe Werte. Hast du irgendein Ideal, Felix? –

+0

Jemand schlug mir vor, mit dem Lesen von Komplex 16 oder 32 zu versuchen, aber ich verstehe immer noch nicht, wie es funktioniert, hoffe, Sie können mir mehr Ideal geben? Danke, Felix. –

+0

Versuchen Sie etwas wie std :: complex Wert (1e7,2e6); ? – felix

Verwandte Themen