Boost Archive Exception { output stream error }
-
Hallo zusammen,
ich hänge im mmoment an einem Problem, wo ich trotz debuggen nicht weiter komme, vllt könnt ihr mir helfen.
Ich benutzte die BoostLib um das Serialzieren von Objekten zu ermöglichen. Dafür benutzte ich die boost:archive::text_iarchive bzw oarchive
Nun gut ich habe ein kleines Test Class die serialziert werden soll. Allerdings bekomm ich ich die im Titel stehende Exception geworfen. Nach debuggen konnte ich herausfinden das diese Exception gerufen wird weil der outputstream.fail() true liefert.
std::ofstream ofs("/config/testfile.cfg"); boost::archive::text_oarchive text(ofs);das erstellen des oarchive wirft die Exception, beim erstellen des ofstream allerdings alles in ordnung. Mit der klasse die ich serialzieren will hat es ja scheinbar auch nichts zu tun.
Und ja der Ordner config exestiert. Die testfile.cfg nicht, allerding habe ich es auch schon mit der vorhanden Datei probiert, dass machte keinen Unterschied.
Ich komme mir einwenig blöd vor einen Fehler in 2 Zeilen Code zubekommen den ich mir nicht erklären kann.
-
Kann es sein, dass es an der Pfadangabe liegt? Bist Du sicher, dass der ofstream korrekt geöffnet wurde? Zum Testen könntest Du mal einen ostringstream benutzen:
std::ostringstream ostr; boost::archive::text_oarchive oar(ostr); oar << an_serializable_object; std::cout << ostr.str() << '\n';
-
chea77er1 schrieb:
Nun gut ich habe ein kleines Test Class die serialziert werden soll. Allerdings bekomm ich ich die im Titel stehende Exception geworfen. Nach debuggen konnte ich herausfinden das diese Exception gerufen wird weil der outputstream.fail() true liefert.
Dann wurde der Stream wohl nicht ordnungsgemäß geöffnet - die verhalten sich normalerweise etwas ruhiger und werfen nur dann Exceptions, wenn man es ihnen befiehlt.
-
Tachyon schrieb:
Kann es sein, dass es an der Pfadangabe liegt? Bist Du sicher, dass der ofstream korrekt geöffnet wurde? Zum Testen könntest Du mal einen ostringstream benutzen:
std::ostringstream ostr; boost::archive::text_oarchive oar(ostr); oar << an_serializable_object; std::cout << ostr.str() << '\n';Er nimmt keinen ostringstream bzw stringstream an da ein ostream gefragt ist, und der compiler den nicht convertiert kriegt.
-
chea77er1 schrieb:
Er nimmt keinen ostringstream bzw stringstream an da ein ostream gefragt ist, und der compiler den nicht convertiert kriegt.
aber einen ofstream nimmt das Teil trotzdem

Die ganzen Stream-Klassen sind in einer Vererbungs-Hierarchie untereinander verbunden und alle Ausgabe-Streams (ofstream, ostringstream etc) sind Nachkommen von ostream, also sollte jeder Compiler in der Lage sein, irgendeinen Ausgabestream dort zu übergeben.
(es könnte nur sein, daß du den Header <stringstream> vergessen hast)
-
CStoll schrieb:
chea77er1 schrieb:
Er nimmt keinen ostringstream bzw stringstream an da ein ostream gefragt ist, und der compiler den nicht convertiert kriegt.
aber einen ofstream nimmt das Teil trotzdem

Die ganzen Stream-Klassen sind in einer Vererbungs-Hierarchie untereinander verbunden und alle Ausgabe-Streams (ofstream, ostringstream etc) sind Nachkommen von ostream, also sollte jeder Compiler in der Lage sein, irgendeinen Ausgabestream dort zu übergeben.
(es könnte nur sein, daß du den Header <stringstream> vergessen hast)Aja gut danke den hatte ich wohl vergessen^^
Nunja also mit stringstream funktioniert das ganze auch so wie es soll. Allerdings sobald ich stringstream mit ofstream ersetzte bekomm ich wieder die exception.
-
Dann liegt es wohl doch daran, daß das Öffnen/Anlegen der Datei schiefgegangen ist. Bist du dir denn 100% sicher, daß die Pfadangabe korrekt ist? Und hast du mal versucht, den Dateinamen ohne Pfad anzugeben?
-
gm irgentwie merkwürdig, denn ich habe die Datei mal direkt im Ordner des Programms gelegt, und dem entsprechend den source angepasst und siehe da, sobald ich allerding etwas in einem ordner mache geht es nicht.
Ist vielleicht die volle Pfad angabe verlangt?
-
Auf welchem System willst du das ganze eigentlich ausführen? Und wo liegt die Zieldatei im Verhältnis zu deinem Arbeitsverzeichnis?
-
Windows.
Und die zieldatei liegt in einem Ordner der im selben Ordner wie das Programm liegt.
Also:
C:Users/Documents/VS2010/Binaries/configs/zieldatei.datund das Programm:
C:Users/Docuemnts/VS2010/Binaries/bin.exe...
BTW liegt es vllt daran das getcwd(..) mir auch einen ganz anderen Pfad angibt als den wo wirklich die .exe liegt.
-
Dann solltest du mal den / am Anfang des Dateinamens weglassen - damit gibst du an, daß die Datei im Root-Verzeichnis liegt (also unter C:\configs\).