Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit QDataStream
Hallo Leute,
ich habe ein Problem mit QDataStream: Mein Programm schmiert ab:
QFile file( fileName );
file.open( IO_ReadOnly );
QDataStream stream( &file );
stream.setByteOrder(QDataStream::LittleEndian );
stream >> idCom; //idCom ist vom Typ QString
Es lässt sich compilieren, ich starte das Programm und rufe die Funktion auf. Dann kommt die Meldung, dass es einen Ausnahmefehler gegeben hat, und das Programm schmiert ab. Woran kann das liegen?
Vielen Dank,
anda_skoa
30-05-2005, 17:40
stream.setByteOrder(QDataStream::LittleEndian );
Das kannst du eigentlich weglassen.
Woran kann das liegen?
Wenn zb da kein QString sondern etwas anderes im File steht, zb ein int und dann ein QString.
Ein QString wird im DataStream zuerst als Längenangabe gefolgt von Text erwartet, wenn dann nicht die Länge sondern etwas anderes gelesen wird, wird es dennoch als Länge interpretiert und ein entsprechender Puffer wird allokiert.
Da kann es schon vorkommen, daß 4GB Speicher angefordert werden :D
Ciao,
_
Hallo anda_skoa,
vielen Dank für den Hinweis. Die Länge des Strings lese ich extra ein, die steht nämlich in der Zeile davor. Wenn ich das Einlesen der Länge auskommentiere, hängt sich das Programm nicht mehr auf. Du hattest also recht, dass irgendwas eingelesen wird, nur nicht die Länge. Das Problem ist, dass ich Dateien einlesen muss, die nicht mit QDataStream geschrieben wurden. Ich habe eine Anleitung, in welcher Zeile in der Datei was steht. Genauso habe ich die Daten auch eingelesen und hab nicht beachtet, dass in der Zeile vor einem String immer erst die Länge steht.
Leider funktioniert das Einlesen trotzdem noch nicht richtig. Es werden nur "Balken" |||| in unterschiedlicher Anzahl ausgegeben. Kann es daran liegen, dass die Länge in der Zeile davor steht und nicht zusammen mit dem String? Wie kann ich das Problem lösen? Ich kann an der Eingabedatei nichts ändern. Als Typ wird übrigens char[] statt String angeben. Kann ich char[] auch mit QDataStream einlesen? :confused:
Warum meinst du, dass ich "stream.setByteOrder(QDataStream::LittleEndian );" nicht brauche? Das Dateiformat ist LittleEndian, und bei QDataStream ist es defaultmäßig BigEndian.
Schöne Grüße,
anda_skoa
30-05-2005, 19:05
vielen Dank für den Hinweis. Die Länge des Strings lese ich extra ein, die steht nämlich in der Zeile davor.
Zeile?
In binären Dateien gibt es keine Zeilen, d.h. das Konzept "Zeile" bezieht sich normalerweise immer auf Textdateien.
Das Problem ist, dass ich Dateien einlesen muss, die nicht mit QDataStream geschrieben wurden.
Ah!
QDataStream ist für plattforum- und architekturunabhängigen Datentranfer gedacht, also sowohl schreibend als auch lesend. Immer als Paar.
Wenn du andere binäre Dateien lesen mußt, kannst du zwar mir readRawBytes arbeiten, aber ich würde dann eher gleich mit QFile::readBlock arbeiten.
Leider funktioniert das Einlesen trotzdem noch nicht richtig. Es werden nur "Balken" |||| in unterschiedlicher Anzahl ausgegeben.
Könnte am Encoding liegen.
QString wird seinen Inhalt vermutlich UTF-8 oder UTF-16 erwarten.
Warum meinst du, dass ich "stream.setByteOrder(QDataStream::LittleEndian );" nicht brauche? Das Dateiformat ist LittleEndian, und bei QDataStream ist es defaultmäßig BigEndian.
Das basierte auf der Annahme, daß du QDataStream zum Lesen von Daten benutzt, die mit QDataStream geschrieben wurden. In diesem Fall steht auch ein geändertes Format im Stream und wird automatisch erkannt.
Ciao,
_
Hallo anda_skoa,
wenn es keine Zeilen gibt, habe ich das Problem mit dem Zeilenumbruch vermutlich nicht. Ich werde deine verschiedenen Vorschläge ausprobieren. Ich möchte auf jeden Fall QDataStream verwenden (wenn es irgendwie geht), weil ich viele verschiedene Datentypen (int, short, usw) aus eine Datei einlesen muss. Da ist QDataStream einfach praktisch.
Leider muss ich die Daten so benutzen, wie sie geliefert werden. Ich bekomme die erstellten Dateien aus einem anderen Programm und muss sie zur weiteren Verarbeitung in meins einlesen. Wenn die auch Qt und QDataStream benutzt hätten, wäre es einfacher. ;)
Schöne Grüße,
anda_skoa
30-05-2005, 23:18
Ich möchte auf jeden Fall QDataStream verwenden (wenn es irgendwie geht), weil ich viele verschiedene Datentypen (int, short, usw) aus eine Datei einlesen muss. Da ist QDataStream einfach praktisch.
Das setzt immer vorraus, daß ein entsprechender QDataStream geschrieben hat, denn allen Typen wird glaub ich immer ein Typ Identifikator vorangeschrieben.
Allerdings könnten normale C++ Streams gehen.
Ciao,
_
Hallo anda_skoa,
ich habe eine Funktion geschrieben, die das Auslesen der Strings übernimmt:
QString CHPParser::readString(QDataStream stream, int length)
{
QString s;
char *c = new char[length];
stream.readRawBytes(c, length);
s = QString::fromUtf8( c, length );
return s;
}
Der Aufruf erfolgt dann so: idCom = readString( stream, idStringLength );
Das müsste so richtig sein, denn ich erhalte sinnvolle Ergebnisse. Die Informationen in der Datei sind leider so nicht lesbar, da sie binär abgespeichert sind.
Vielen Dank noch mal für deine Hilfe. Ich weiß gar nicht, wie ich die Probleme sonst gelöst hätte. Programmierst du schon lange mit Qt?
Schöne Grüße, :)
anda_skoa
31-05-2005, 12:21
ich habe eine Funktion geschrieben, die das Auslesen der Strings übernimmt:
Gute Idee.
Wenn das Lesen der Länge davor immer gleich ist, also die Bytes direkt vor dem String, dann könntest du das auch direkt in der Methode machen.
Das müsste so richtig sein, denn ich erhalte sinnvolle Ergebnisse. Die Informationen in der Datei sind leider so nicht lesbar, da sie binär abgespeichert sind.
Ich würde mich auf jeden Fall vergewissern, daß die Daten dort UTF-8 kodiert drinnen stehen.
Bei reinen ASCII Zeichen ist da noch kein unterschied, aber bei Umlauten, etc. schon
Programmierst du schon lange mit Qt?
Privat seit ca 2000, Qt 1.44 wenn ich mich richtig erinnere :)
Beruflich erst seit ca 3 Jahren
Ciao,
_
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.