Unerwartetes Dateiformat
-
Hallo,
ich habe einige Änderungen in meinem Programm vorgenommen. Jetzt erhalte ich beim Öffnen der Datei die Meldung "Unerwartetes Dateiformat"). Aus den Postings in diesem Forum wurde ich nicht schlau.
Was muss ich tun, damit sich das Dateiformat ändert?
Grüsse
Franz
-
_WAS_ für ein Dateiformat hast du denn da?!
-
Kann es einfach sein, dass Du die Serrialisierung Deiner Daten geändert hast?
Dadurch bekommst Du nun beim Öffnen diese Exception.
-
Ja, ich habe was in der Serialisierung geändert. Seitdem kommt diese Meldung.
-
Also versuchst du grad mit deiner NEUEN Serialisierung deine ALTEN Dateien zu öffnen oder sind das auch schon Dateien, die neu Serialisiert wurden?
-
Ich habe das Programm erstellt und, mit Daten gefüllt und abgespeichert. Alles funktionierte prima. Mir fiel dann aber ein, dass ich noch einige Änderungen vornehmen könnte, was ich auch getan habe. Dazu brauchte ich aber wiederum einige Variablen, die ich dann in die Serialisierung eingegeben habe. Erstellen konnte ich das Programm einwandfrei. Nachdem ich wiederum Werte eingegeben habe, die Datei abspeicherte und anschliessend wieder öffnen wollte, kam die besagte Nachricht.
Wo habe ich den Fehler gemacht und wie kann ich ihn beheben? Ich möchte das Programm nicht nochmals schreiben.
Grüsse
Franz
-
Zeig einfach mal deinen Serialisierungs-Code.
-
#include "stdafx.h" #include "Tanke.h" IMPLEMENT_SERIAL(CTanke, CObject, 0) void CTanke::Serialize(CArchive& ar) { if(ar.IsStoring()) { ar << m_strBarbrutto << m_strBardiesel3gesamt << m_strBardiesel4gesamt << m_strBarnetto << m_strBarnormalgesamt << m_strBarsuper2gesamt << m_strBarsuper5gesamt << m_strBarsuper6gesamt << m_strBarzahlungdiesel3 << m_strBarzahlungnormal << m_strBarzahlungsuper2 << m_strBarzahlungsuper5 << m_strBarzahlungsuper6 << m_strDatum << m_strEcdiesel3gesamt << m_strEcdiesel4gesamt << m_strEcheute << m_strEcnormalgesamt << m_strEcsuper2gesamt << m_strEcsuper5gesamt << m_strEcsuper6gesamt << m_strEczahlungdiesel3 << m_strEczahlungdiesel4 << m_strEczahlungnormal << m_strEczahlungsuper2 << m_strEczahlungsuper5 << m_strEczahlungsuper6 << m_strMehrwertsteuer << m_strMonatbrutto << m_strMonatnetto << m_strPrivatentnahme << m_strPrivatentnahmegesamt << m_strRechnungdiesel3 << m_strRechnungdiesel3gesamt << m_strRechnungdiesel4 << m_strRechnungdiesel4gesamt << m_strRechnungheute << m_strRechnungnormal << m_strRechnungnormalgesamt << m_strRechnungsuper2 << m_strRechnungsuper2gesamt << m_strRechnungsuper5 << m_strRechnungsuper5gesamt << m_strRechnungsuper6 << m_strRechnungsuper6gesamt << m_strSeite << m_strTagespreisbenzin << m_strTagespreisdiesel << m_strTagespreissuper << m_strZaehlerstanddiesel3alt << m_strZaehlerstanddiesel3neu << m_strZaehlerstanddiesel4alt << m_strZaehlerstanddiesel4neu << m_strZaehlerstandnormalalt << m_strZaehlerstandnormalneu << m_strZaehlerstandsuper2alt << m_strZaehlerstandsuper2neu << m_strZaehlerstandsuper5alt << m_strZaehlerstandsuper5neu << m_strZaehlerstandsuper6alt << m_strZaehlerstandsuper6neu << m_strBarzahlungdiesel4 << m_strAbgabediesel3gesamt << m_strAbgabediesel4gesamt << m_strAbgabenormalgesamt << m_strAbgabesuper2gesamt << m_strAbgabesuper5gesamt << m_strAbgabesuper6gesamt << m_strKundenmonat << m_strKunden1 << m_strKunden2 << m_strKunden3 << m_strKunden4 << m_strKunden5 << m_strKunden6 << m_strMehrwert << m_strDiesel << m_strNormalbenzin << m_strSuper; } else { ar >> m_strBarbrutto >> m_strBardiesel3gesamt >> m_strBardiesel4gesamt >> m_strBarnetto >> m_strBarnormalgesamt >> m_strBarsuper2gesamt >> m_strBarsuper5gesamt >> m_strBarsuper6gesamt >> m_strBarzahlungdiesel3 >> m_strBarzahlungnormal >> m_strBarzahlungsuper2 >> m_strBarzahlungsuper5 >> m_strBarzahlungsuper6 >> m_strDatum >> m_strEcdiesel3gesamt >> m_strEcdiesel4gesamt >> m_strEcheute >> m_strEcnormalgesamt >> m_strEcsuper2gesamt >> m_strEcsuper5gesamt >> m_strEcsuper6gesamt >> m_strEczahlungdiesel3 >> m_strEczahlungdiesel4 >> m_strEczahlungnormal >> m_strEczahlungsuper2 >> m_strEczahlungsuper5 >> m_strEczahlungsuper6 >> m_strMehrwertsteuer >> m_strMonatbrutto >> m_strMonatnetto >> m_strPrivatentnahme >> m_strPrivatentnahmegesamt >> m_strRechnungdiesel3 >> m_strRechnungdiesel3gesamt >> m_strRechnungdiesel4 >> m_strRechnungdiesel4gesamt >> m_strRechnungheute >> m_strRechnungnormal >> m_strRechnungnormalgesamt >> m_strRechnungsuper2 >> m_strRechnungsuper2gesamt >> m_strRechnungsuper5 >> m_strRechnungsuper5gesamt >> m_strRechnungsuper6 >> m_strRechnungsuper6gesamt >> m_strSeite >> m_strTagespreisbenzin >> m_strTagespreisdiesel >> m_strTagespreissuper >> m_strZaehlerstanddiesel3alt >> m_strZaehlerstanddiesel3neu >> m_strZaehlerstanddiesel4alt >> m_strZaehlerstanddiesel4neu >> m_strZaehlerstandnormalalt >> m_strZaehlerstandnormalneu >> m_strZaehlerstandsuper2alt >> m_strZaehlerstandsuper2neu >> m_strZaehlerstandsuper5alt >> m_strZaehlerstandsuper5neu >> m_strZaehlerstandsuper6alt >> m_strZaehlerstandsuper6neu >> m_strBarzahlungdiesel4 >> m_strAbgabediesel3gesamt >> m_strAbgabediesel4gesamt >> m_strAbgabenormalgesamt >> m_strAbgabesuper2gesamt >> m_strAbgabesuper5gesamt >> m_strAbgabesuper6gesamt >> m_strKundenmonat >> m_strKunden1 >> m_strKunden2 >> m_strKunden3 >> m_strKunden4 >> m_strKunden5 >> m_strKunden6 >> m_strMehrwert >> m_strMehrwert >> m_strDiesel >> m_strNormalbenzin >> m_strSuper ; } }So, das ist ein Auszug aus dem Serialisierungscode. Die letzten drei Datenelemente habe ich nachträglich eingefügt. Seitdem gehts nicht mehr.
Grüsse
Franz
-
Klar weil nun die Datei vorzeitig zu Ende ist.
Du kanst nun die Daten vor dem Laden auf 0 setzen und die Exception abfangen und ignorierentry { // Dein Serialisierungscode ... } catch (CArchiveException *e) { e->Delete(); }
-
Noch eleganter geht es, wenn man die Versionierung gleich mit einplant:
#define SCHEMA_VERSION_1 (0x1) #define SCHEMA_VERSION_2 (0x2) #define SCHEMA_VERSION_CURRENT SCHEMA_VERSION_2 IMPLEMENT_SERIAL(CTanke, CObject, VERSIONABLE_SCHEMA | SCHEMA_VERSION_CURRENT) // Serialisierung void CTanke::Serialize(CArchive& ar) { // Version abfragen int iSchema = ar.GetObjectSchema(); // Version des Objekts ist groesser als die unterstuetzte if (iSchema > SCHEMA_VERSION_CURRENT && ar.IsLoading()) { AfxThrowArchiveException(CArchiveException::badSchema); } // Laden if (ar.IsLoading()) { // Version 1.x ar >> m_strString1; ar >> m_strString2; // Version 2.x if (iSchema >= SCHEMA_VERSION_2) { ar >> m_strString3; ar >> m_strString4; } } // Speichern else { // Version 1.x ar << m_strString1; ar << m_strString2; // Version 2.x ar << m_strString3; ar << m_strString4; } }
-
Spricht eigentlich was gegen etwas in der Art:
void Serialize(CArchive& ar, String& str) { if (ar.IsLoading()) ar >> str; else ar << str; } void CTanke::Serialize(CArchive& ar) { // Version abfragen int iSchema = ar.GetObjectSchema(); // Version des Objekts ist groesser als die unterstuetzte if (iSchema > SCHEMA_VERSION_CURRENT && ar.IsLoading()) AfxThrowArchiveException(CArchiveException::badSchema); // Version 1.x Serialize(ar, m_strString1); Serialize(ar, m_strString2); // Version 2.x if (iSchema >= SCHEMA_VERSION_2) { Serialize(ar, m_strString3); Serialize(ar, m_strString4); } }Ich habe das so selbst noch nie verwendet (ich mache nicht viel MFC, und noch weniger mit Serialisierung), bloss hab' ich mich immer gewundert wieso es in *keinem* der MFC Programme die ich bisher gesehen habe so gemacht wird.
-
Franz Hembera schrieb:
#include "stdafx.h" m_strMehrwert >> m_strMehrwert >> }Bei Zeile 167
-
hustbaer schrieb:
Spricht eigentlich was gegen etwas in der Art:
void Serialize(CArchive& ar, String& str) { if (ar.IsLoading()) ar >> str; else ar << str; } void CTanke::Serialize(CArchive& ar) { // Version abfragen int iSchema = ar.GetObjectSchema(); // Version des Objekts ist groesser als die unterstuetzte if (iSchema > SCHEMA_VERSION_CURRENT && ar.IsLoading()) AfxThrowArchiveException(CArchiveException::badSchema); // Version 1.x Serialize(ar, m_strString1); Serialize(ar, m_strString2); // Version 2.x if (iSchema >= SCHEMA_VERSION_2) { Serialize(ar, m_strString3); Serialize(ar, m_strString4); } }Ich habe das so selbst noch nie verwendet (ich mache nicht viel MFC, und noch weniger mit Serialisierung), bloss hab' ich mich immer gewundert wieso es in *keinem* der MFC Programme die ich bisher gesehen habe so gemacht wird.
Nein, dagegen spricht nichts. Letztlich unterscheidet es sich von meinem Beispiel nur darin, dass die Serialisierung der verschiedenen Strings ausgelagert wird. Damit wird die Funktion selbst etwas übersichtlicher. Jeder Datentyp verlangt dann aber auch eine eigene Serialize-Funktion.
Der Vorteil dieser Methode ist, dass bei Programmupdates die alten Dateien einfach übernommen werden können. Der andere Weg (alte Programme lesen neuere Dateien) ist aber fast unmöglich.
Ich selbst habe diese Methode ziemlich oft verwendet, mittlerweile speichere ich aber nur noch in XML-Dateien.
-
Danke für Euere Postings. Habe das ganze umgestellt und bekomme jetzt vom Compiler eine Meldung wegen Stapelüberlauf, nachdem ich /Zm auf 2000 gesetzt habe. Meine Programmierkünste sind leider nicht so, dass ich damit grosse Sprünge machen kann. Vieles von dem, was so gepostet wird, verstehe ich nicht so recht.
Habe das ganze Programm gelöscht und begnüge mich nun mit meiner ersten Version.
Nochmals herzlichen Dank und Grüsse
Franz
-
Rebuild All bereits versucht?
Warum verwendest Du /Zm? Ich habe diese Optionnoch nie benötigt, und meine Projekte sindnicht klein.
-
Beim Kompilieren kam die Meldung, dass die Dateien zu gross für den Compiler sind und ich /Zm verwenden soll. Der Maximalwert ist da 2000. Leider hat das auch nicht ausgereicht.
Grüsse
Franz
-
Versuchs mal mit /Zm800, bei grösseren Werten hab' ich schon Probleme gehabt. Bzw. spiel dich einfach mal ein wenig.
Und... seit ich VC7.1 bzw. 8.0 verwende hab ich /Zm überhaupt nie mehr gebraucht.
-
Danke hustbaer, werde es mal probieren!
Grüsse
Franz