[gelöst] QTextStream: peek?

Alles rund um die Programmierung mit Qt
Antworten
N¤X
Beiträge: 77
Registriert: 21. September 2009 12:24

[gelöst] QTextStream: peek?

Beitrag 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
Zuletzt geändert von N&#164;X am 29. Januar 2010 09:11, insgesamt 1-mal geändert.
mfg N¤X
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QIODevice::readLine() für die Zeilen, dann splitten und dann QByteArray::toDouble()...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
N&#164;X
Beiträge: 77
Registriert: 21. September 2009 12:24

Beitrag 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 ^^
mfg N¤X
Antworten