Seite 1 von 1

QFile Zeilen auslesen und Inhalt abspeichern [gelöst]

Verfasst: 13. Mai 2008 15:01
von Qt-nator
Hi,

ich möchte mit einem QFileDialog eine Datei auswählen und diese dann Zeile für Zeile auslehsen. Bis ein bestimmtes schlagwort drin vorkommt.

Desweitern möchte ich wenn andere Schlagwörter vorkommen er mir das was Hinter diesen Wörtern steht (sind alle durch ein = getrennt) in die Jeweiligen Variablen schreibt und danach eine Zeile weiter springt.

Jetzt weis ich halt nicht wie man das mit QFile macht.

Wäre für Hilfe dankbar.

Gruß

Qt-nator

Verfasst: 13. Mai 2008 15:05
von Christian81
Was genau weißt Du nicht?
Datei öffnen, Daten Zeile für Zeile lesen und auswerten, fertig.

Verfasst: 13. Mai 2008 15:08
von Qt-nator
Wie ich die Datei Zeile für Zeile auslese.

Verfasst: 13. Mai 2008 15:12
von Christian81
Wusste ich es doch - die Qt-Doku mal wieder absolut nicht gelesen denn genau das wird in der Doku zu QFile beschrieben :roll:

Verfasst: 13. Mai 2008 15:17
von RHBaum
Vielleicht isses aber auch nur zu kompliziert, um von QFile auf QIODevice zu kommen (in der Doku) ... :?:
Ne Funktion nicht zu finden, die schon "readline" heisst,d as grenzt schon an, naja ^^ Eigentlich sollten alle, die die qt selbst installiert haben, ueber diesem Status hinaus sein :-)

Ciao ...

Verfasst: 13. Mai 2008 15:17
von Qt-nator
Muss man mit dem readline machen oder. Nur versteh ich das nicht so ganz.

Würde das gehn?

Code: Alles auswählen

 

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

Liest er dann alle Zeilen aus??

Verfasst: 13. Mai 2008 15:19
von Christian81
Qt-nator hat geschrieben: Liest er dann alle Zeilen aus??
Schau Dir endlich die Doku zu QFile an!!!
RHBaum hat geschrieben:Vielleicht isses aber auch nur zu kompliziert, um von QFile auf QIODevice zu kommen (in der Doku) ... :?:
Das ist ja das Schlimme - man muss es nicht mal. Einfach mal die Seite durchlesen, es wird genau das Problem welches er hat in 'Read more' erklärt - aber anscheinend ist selbst das zu schwer :/

Verfasst: 13. Mai 2008 15:20
von Qt-nator
Wenn ichs doch nicht verstehe!!!

Verfasst: 13. Mai 2008 15:24
von Christian81
Qt-nator hat geschrieben:Wenn ichs doch nicht verstehe!!!
Was? Die 3 Zeilen in der Doku:

Code: Alles auswählen

Reading Files Directly

The following example reads a text file line by line:

     QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     while (!file.atEnd()) {
         QByteArray line = file.readLine();
         process_line(line);
     }

The QIODevice::Text flag passed to open() tells Qt to convert Windows-style line terminators ("\r\n") into C++-style terminators ("\n"). By default, QFile assumes binary, i.e. it doesn't perform any conversion on the bytes stored in the file.
Using Streams to Read Files

The next example uses QTextStream to read a text file line by line:

     QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     QTextStream in(&file);
     while (!in.atEnd()) {
         QString line = in.readLine();
         process_line(line);
     }
Wenn dem so ist können wir wohl leider auch nicht helfen :(

Verfasst: 13. Mai 2008 15:33
von Qt-nator
Was macht den dieses process_line(line);??

Verfasst: 13. Mai 2008 15:34
von RHBaum
Wenn ichs doch nicht verstehe!!!
Aehm ja, dann muss man tiefer ansetzen .... und nicht die QT ist dein eigentliches Problem.
Fuer die QT sollte man:
- c++ koennen, und das zwar ganz gut
- Dokumentationen lesen koennen

2. punkt eigentlich fuer alles was mit programmieren zu tun hat.

Also schau dir genau an mit was du Probleme beim verstehen hasst.

Normal brauch ich nicht mal eine zeile in der Doku zu lesen ... sondern ich "seh" eigentlich nur die funktionssignatur, also namen und parameter, und weiss zu 90% was "die" damit wollen. nachlesen muss ich dann nur noch "details" ueber das verhalten.

Klar, kann man das ned von anfang an, uebung .etc klar. Aber mit der Qt anfangen zu ueben .... ich weiss ned.
Also mit der STL und so sollt man sich schon bissi auskennen, und spaetestens wenn man sich die STL anschaut, sollt man nen gefuehl fuer sowas bekommen.

Und ja dein Code oben sollt so funktionieren. Ich hoffe es war nicht nur reines Glueck :-)
atEnd() und readline() machen genau das, wie sie heissen :-)
readline liefert dir aber nen QByteArray zurueck, welches der QString aber auch automatisch wandeln kann.

Bleibt eigentlich nur die Frage, warum fragst uns ? das kann man doch probieren ? und grad so lernt man auch dabei. Und Compilerfehler lesen lernen, ist auch nen sehr wichtiger Punkt.

Ciao ...

Verfasst: 13. Mai 2008 15:38
von RHBaum
process_line
process = verarbeiten (in dem falle)

vielleicht besser verstaendlich in dem falle waer:

Code: Alles auswählen

   
QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     while (!file.atEnd()) {
         QByteArray line = file.readLine();
         // nun tue hier irgend etwas mit der ausgelesenen zeile 
     } 
iss also ne art dummy function die nur auf was hinweissen soll ...

Ciao ...

Verfasst: 13. Mai 2008 15:43
von Qt-nator
Vielen Vielen Dank RHBaum für die erklärung hat es echt verständlicher gemacht.

Das mein erster bescheidener Versuch:

Code: Alles auswählen


void
ImportExport::Import(void)
{
  QString strDataName;

  QFileDialog::Options options;

  QString strFileName = QFileDialog::getOpenFileName(0, tr("Parameter Map Open"), strDataName, tr("Parameter Map (*.map)"));

  QFile file(strFileName);

  QTextStream Text(&file);

  file.open(QFile::ReadOnly);
  
  while (!file.atEnd()) 
  {
    QByteArray strLine = file.readLine();

    if(strLine.startsWith("Version="))
    {
      QString strText = strLine.mid(8);

      strText.toDouble();  

      QMessageBox::information(0, tr("Save"), (strText));
    }
    else if(strLine.startsWith("Description="))
    {
      QString strText = strLine.mid(12);

      QMessageBox::information(0, tr("Save"), (strText));
    }
  }
}


Lässt sich jedenfalls Kompilieren jetzt muss ichs nur noch einbinden und testen.

Meine Frage wäre jetzt ob das der Richtige weg ist.

Wegen Doku lesen... hätte ich ausführlicher machen sollen.. hab sie nur überflogen..