Seite 1 von 1

[gelöst] QTextStream: peek?

Verfasst: 28. Januar 2010 21:44
von N¤X
Hallo
Zuerstmal: ich habe die Suche benutzt und leider nichts gefunden, obwohl sich das Problem recht alltäglich anhört :(

Ich habe Textdateien (leider nicht binär sondern wirklich Text) mit mehreren (n>=3) durch Leerzeichen getrennten doubles in jeder Zeile, die ich auslesen will. Es gibt aber auch ein Kommentarzeichen, wenn das am Zeilenanfang steht soll die Zeile ausgelassen werden.

Den Pseudocode für das Problem hab ich mir so in der Art vorgestellt:

Code: Alles auswählen

Für alle Zeilen
  wenn erstes Zeichen == Kommentarzeichen
    Zeile Skippen
  sonst
    while not end of line
      doubleliste << konvertierter double
Mein Problem: Womit mach ich das am besten? QFile liefert immer nur ByteArrays und kann nicht von selbst von Text nach Double konvertieren, QTextStream hat aber keine peak-Funktion um das erste Zeichen zu lesen ohne den get-Pointer zu manipulieren. Also beides irgendwie unpassend. Oder kann man das (Qt-typisch) irgendwie schöner, toller und besser machen? :)

PS: Das Hauptaugenmerk sollte nicht unbedingt auf elegantem Code liegen, vielmehr bin ich an ner effizienten Lösung interessiert. Die Dateien können gerne mal 9Mio Zeilen haben (Wissenschaftlicher Datenmüll -_-) und wenn jemand sagt mit ifstream gehts schneller mach ichs auch gerne damit, ich dachte halt nur, dass Qt das vllt auch schön und schnell kann

Verfasst: 28. Januar 2010 21:57
von Christian81
QIODevice::readLine() für die Zeilen, dann splitten und dann QByteArray::toDouble()...

Verfasst: 29. Januar 2010 09:14
von N&#164;X
Danke für die schnelle Hilfe :)
Bisher siehts zu Testzwecken mal so aus:

Code: Alles auswählen

QFile file(filename);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
   QByteArray line;
   QList<QByteArray> list;
   while (!file.atEnd()) {
      if (file.peek(1) != "#") {
         line = file.readLine().simplified();
         if (line.size() != 0) {
            list = line.split(' ');
            for (int i=0; i<list.size(); i++) {
               qDebug("%f", list[i].toDouble());
            }
         }
      }
      else {
         file.readLine();
      }
   }
}
Das funktioniert schonmal, dann mach ich mal weiter und guck obs mit großen Dateien auch gut klarkommt ^^