2017-10-27 3 views
0

So, hier ist ein einfaches Stück Code, ich bin mit einem std deserialisieren :: mapBoost-Deserialisierung gibt mir einen Eingangsstrom Fehler

std::map<std::string, std::string> func(std::string filepath) { 
     map<std::string, std::string> filemap; 
     // read file 
     ifstream ifs(filepath, ios::in | ios::binary); 
     if (!ifs.good()) { 
      std::cout << "failed to read file" << std::endl; 
      return filemap; 
     } 

     string content((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>())); 

     // deserialize 
     stringstream ss; 
     ss << content; 
     std::cout << "content length: " << content.length() << std::endl; 

     boost::archive::binary_iarchive ia(ss); 
     try { 
      ia >> filemap; 
     } 
     catch (const std::exception& e) { 
      std::cout << e.what() << std::endl; 
     } 
     return filemap; 
    } 

Hier ist das Ding, das mein Herz erbeben macht. Es läuft gut in C++. IMMER. Wieder und wieder und wieder. Ich kann die Karte deserialisieren und damit machen, was ich will. Alles gut.

Meine C++ - Bibliothek wird jedoch in CLI verpackt, so dass ich es aus einer C# -Anwendung ausführen kann (so muss es sein). Aus der C# -Anwendung

ia >> filemap; 

erzeugt einen "Eingangsstromfehler". Nicht immer, 19 von 20 Mal lief ich es. Ich kann nicht für das Leben von mir verstehen, warum es sich hier anders verhält. Ich bin kurz davor, alle meine Haare auszuziehen.

Ich denke, die Datei lesen Teil ist in Ordnung. Ich kann den Inhalt von "Inhalt" buchstäblich ausdrucken, und es sieht gut aus.

Eine andere lustige Sache, die passiert, ist, dass, nachdem der erste Fehler erzeugt wird, wenn ich ~ 5-10 Minuten warte, ein "Debug Assertion Failed" -Fehlerdialog erscheint, anscheinend von vector.h. Es heißt "Ausdruck: Vektor-Index außerhalb des Bereichs". Ich habe die Quelle noch nicht herausgefunden, also bin ich mir nicht sicher, ob es direkt oder nur eine Nebenwirkung ist.

Antwort

0

Binärarchive sind nicht plattformunabhängig. Wenn Sie mit radikal verschiedenen Compiler-Flags (z. B. C++ - cli) arbeiten, ist das Layout nicht kompatibel.

Wenn Sie etwas mehr benötigen, verwenden Sie EOS Portable Archive.

Zwischenzeit:

Ich kann buchstäblich den Inhalt von "Inhalt" ausdrucken, und es sieht gut aus

Es Binärdaten ist. Wie um alles in der Welt kann man sehen, dass es "gut aussieht". Es sieht nur dann gut aus, wenn man sagen kann, es ist Bit für Bit identisch mit etwas, das man als gut bezeichnen kann (und man kann beweisen, dass es gut ist). Wenn Sie das wissen, haben Sie die Bestätigung, dass die Archivportabilität tatsächlich das Problem ist.

+0

PS. Ich vergesse zu erwähnen, wenn es nicht das Format selbst ist, dann haben Sie höchstwahrscheinlich unbestimmt Verhalten an anderer Stelle stören (Denken Sie an Speicher oder Stack Korruption) – sehe

+0

Das ist gut zu wissen, ich hatte nicht erkannt, dass das Layout ändern könnte. Ich denke nicht, dass das hier das Problem ist. Wenn es so wäre, würde ich ständig zusammenbrechen; es liest schließlich die gleiche Datei. Gelegentlich läuft das Programm bis zum Ende und verhält sich wie erwartet. – user3765410

+0

Ich würde immer noch die Binärdarstellungen zwischen den verschiedenen Builds überprüfen. Wenn beide Builds in die bitweise identische Datei serialisieren, wissen Sie, dass Sie [Undefined Behavior] (https://en.wikipedia.org/wiki/Undefined_behavior) an anderer Stelle haben. Wenn dies nicht der Fall ist, haben Sie ein nicht definiertes Verhalten, weil Sie das beschädigte Archiv gelesen haben. – sehe

Verwandte Themen