Seite 1 von 1

[gelöst] QString zeichenweise als Stream einlesen

Verfasst: 25. November 2005 12:51
von Ahmet Arslan
Hallo!

Kann mir jemand einen Tipp geben, wie ich einen QString zeichenweise einlesen kann?

Zwar könnte der String auch mit der For-Schleife:

Code: Alles auswählen

for( uint i = 0; i < string.length(); i++ )
durchlaufen werden, jedoch würde ich gerne die push_back - Methode benutzen, um Zeichen wieder in den Stream zurückzuschreiben.

Wenn ich einen QTextStream mit dem String erzeuge, dann habe ich mit read() und readLine() nur die Möglichkeit, den ganzen String einzulesen.

Ich stelle mir das im Grunde genommen wie folgt vor (ist aber Murks!):

Code: Alles auswählen

QString text = "Dies ist ein Test";
  QString result = "";
  QTextStream textStream( text, IO_ReadOnly );
  QTextStream resultStream( result, IO_WriteOnly );
  while( !textStream.atEnd() )
  {
    resultStream << textStream; 
    qDebug( resultStream.read() );
  }
Danke im Voraus!

Verfasst: 25. November 2005 14:40
von Christian81
Und was willst Du damit erreichen?

Verfasst: 25. November 2005 19:31
von Ahmet Arslan
Ich suche nach einer Möglichkeit, einen Stream zeichenweise zu lesen und bei bestimmten auftretenden Zeichen eine Zeichenkette wieder in den Stream zurück zu schreiben.

Zum Beispiel die Zeichenkette:

"xx yy zz"

Nur wenn beim lesen die Zeichenkette "zz" auftritt, dann ist "xx yy" zusammengesetzt zu verstehen, sonst als "xx" und "yy". Um danach "zz" weiterzuverarbeiten, war es in einem anderen Zusammenhang für mich eine geschickte Möglichkeit, die Zeichenkette "zz" wieder in den Stream mit push_back(.) zurückzuschreiben.

Ist das vielleicht nicht nötig?
Sollte ich das bei einem gegebenen String besser im Rahmen der beschriebenen For-Schleife mit der Postionsbestimmung von Zeichenketten arbeiten?

Verfasst: 25. November 2005 19:34
von BartSimpson
inder Doku steht:
QTextStream in(file);
QChar ch1, ch2, ch3;
in >> ch1 >> ch2 >> ch3;

Verfasst: 25. November 2005 19:36
von Christian81
Ich würde evtl. erst alles lesen und dann später die Auswertungen machen. So wie Du es beschreibst bleibt dir eh nichts anderes übrig als Zeichen für Zeichen abzuarbeiten. Und da ist es evtl. besser wenn man nicht noch mit Streams rumhantieren muss.
Wenn Du mehr Zeit hast und dich mit regulären Ausdrücken etwas auskennst, wäre evtl. QRegExp eine gute Möglichkeit Strings zu parsen...

Verfasst: 25. November 2005 19:59
von Ahmet Arslan
BartSimpson hat geschrieben:inder Doku steht:
QTextStream in(file);
QChar ch1, ch2, ch3;
in >> ch1 >> ch2 >> ch3;
Ich habe die Doku sorgfältig gelesen! Und außerdem haben ich das Kapitel 10 "Input/Output: Reading and Writing Text" von "C++ GUI programing with Qt" vor mir liegen, das leider genau an der Stelle nicht mehr weiter vertieft, an der es für mich interessant wird. Da heißt es:
Writing Text data isn't difficult, but reading text can be challenging. For complex formats, a full-blown parser might be required. Such a parser would typically work by reading the data character by character using >> on a QChar, or line by line using readLine() and iterating through the returned QString.
Christian81 hat geschrieben:Ich würde evtl. erst alles lesen und dann später die Auswertungen machen. So wie Du es beschreibst bleibt dir eh nichts anderes übrig als Zeichen für Zeichen abzuarbeiten. Und da ist es evtl. besser wenn man nicht noch mit Streams rumhantieren muss.
Wenn Du mehr Zeit hast und dich mit regulären Ausdrücken etwas auskennst, wäre evtl. QRegExp eine gute Möglichkeit Strings zu parsen...
Einfacher ist natürlich die Version mit der For-Schleife, aber ich dachte, wenn es heißt "such a parser would typically work by ...", dann versuche ich es auch besser "typically" zu machen. Leider wird nicht beschrieben, wie und ich habe den Code schon hin und hergewendet. Ohne Erfolg.

Verfasst: 25. November 2005 20:28
von Ahmet Arslan
BartSimpson hat geschrieben:inder Doku steht:
QTextStream in(file);
QChar ch1, ch2, ch3;
in >> ch1 >> ch2 >> ch3;
Du hattest recht! Ich hätte mir diese Stelle der Doku genauer ansehen sollen. Mit diesem Code erreicht man das Lesen eines QStrings als Stream:

Code: Alles auswählen

 
QString test = "Ein String";
QTextStream stream( test, IO_ReadWrite );
  QChar c;
  while( !stream.atEnd() ){
    stream >> c;
    qDebug( QString( c ) );
  }
In der Situation ist das auf jeden Fall besser, als mit QRegExp zu arbeiten.

Ich danke euch für eure Hilfe!