Seite 1 von 1

QTextStream? [gelöst]

Verfasst: 12. November 2010 11:12
von Whitefurrows
Hallo,

warum bekomme ich im folgenden Beispiel von ts.readAll() ein anderes Ergebnis wenn ich vorher ts.readLine() ausführe?

Code: Alles auswählen

QTextStream ts (device);
ts.setCodec("UTF-8");

while( !ts.atEnd() )
{
QString line = ts.readLine();
//...
}

ts.seek(NULL);
QString text = ts.readAll();
Der Text sieht in qDebug() schon identisch aus, allerdings ist der erzeugte MD5-Hash aus "text" ein anderer, wenn zuvor ts.readLine() genutzt wurde. Vermutlich fehlen dann irgend welche Steuerzeichen wie z.B. "\r".

Gibt es eine Möglichkeit dass bei ts.readLine() die Steuerzeichen wie "\n" und "\r" nicht entfernt werden?

Vielen Dank schon mal...

Verfasst: 12. November 2010 15:08
von dazedly
Du könntest die newlines wieder selbst einfügen. Warum sollte readline ein newline am Ende der Zeile einlesen?

Verfasst: 12. November 2010 19:49
von Christian81
Es ist nunmal ein stream - wenn man was rausgelesen hat ist es weg. Also was erwartest Du?

Verfasst: 12. November 2010 23:49
von Whitefurrows
OK, war mir so nicht wirklich klar, das es bei einem Stream so ist. Wie kann ich es aber dann machen?

Verfasst: 13. November 2010 09:11
von Christian81
Was machen? Alles lesen? Warum willst du etwas doppelt lesen?

Verfasst: 14. November 2010 13:14
von Whitefurrows
Doppelt will ich nichts lesen. Ich möchte eine Text-Datei zeilenweise lesen, aber auch mit den Steuerzeichen am ende einer Zeile wie "\n", "\r" und "\n\r". Diese werden nämlich nach dem lesen beim generieren des MD5-Hash berücksichtigt.

Verfasst: 14. November 2010 13:37
von Christian81
Ein md5-Hash wird auf den Inhalt einer Datei erstellt. Ein QTextStream liest die Daten einer Datei interpretiert als QString ein. Was soll das ganze also?? Ein QTextStream ist definitiv nicht das korrekte Werkzeug um einen Hash zu erstellen...

Verfasst: 14. November 2010 22:43
von Whitefurrows
Genauer gesagt sind es CSV-Dateien. In der ersten Zeile steht der MD5-Hash welcher den Daten ab der zweiten Zeile entspricht. Vor dem einlesen muss der Hash geprüft werden um ggf. anschließend die Daten zu importieren, welche dann Zeilenweise zu lesen sind. Dabei sind die Steuerzeichen dann unwichtig, da sie nur zum prüfen des Hash benötigt werden. Was wäre für diese Aufgabe dann das richtige Werkzeug bzw. wie könnte es funktionieren?

Verfasst: 14. November 2010 22:56
von Christian81
Wie du schon mitbekommen hast modifiziert ein QTextStream die Daten. Er interpretiert die Daten als Strings. Du willst die Daten als das was sind sind - eine Folge von Bytes. Wie wäre es also mit QIODevice::read() ?

Verfasst: 14. November 2010 23:39
von Whitefurrows
Das wäre soweit auch OK, aber wie bekomme ich dann mit read nur die Folge von Bytes ab der Zweiten Zeile?

Verfasst: 15. November 2010 06:32
von Christian81
Indem man nach \n sucht würde ich sagen ...

Verfasst: 15. November 2010 21:51
von Whitefurrows
Schon klar, aber wie kann ich mit dem QIODevice nach "\n" suchen und dann alles nach dem "\n" bzw. "\n\r" lesen? Weil das "\r" darf in dem Hash nicht berücksichtigt werden, falls vorhanden.

Verfasst: 16. November 2010 06:29
von Christian81
Doku -> QIODevice::read bzw. QIODevice::readAll -> QByteArray::indexOf() ... :roll:

Verfasst: 22. November 2010 13:49
von Whitefurrows
Die liebe Doku sehr gut, aber auch groß und ich hatte leider nicht das richtige gefunden. Vielen Dank für die Hilfe, jetzt funktioniert alles!