QFile Zeilen auslesen und Inhalt abspeichern [gelöst]

Verschiedenes zu Qt
Antworten
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

QFile Zeilen auslesen und Inhalt abspeichern [gelöst]

Beitrag 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
Zuletzt geändert von Qt-nator am 14. Mai 2008 08:34, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was genau weißt Du nicht?
Datei öffnen, Daten Zeile für Zeile lesen und auswerten, fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Wie ich die Datei Zeile für Zeile auslese.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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:
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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??
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :/
Zuletzt geändert von Christian81 am 13. Mai 2008 15:22, insgesamt 1-mal geändert.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Wenn ichs doch nicht verstehe!!!
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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 :(
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag von Qt-nator »

Was macht den dieses process_line(line);??
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Qt-nator
Beiträge: 153
Registriert: 18. Dezember 2007 10:31

Beitrag 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..
Antworten