Seite 1 von 1

Probleme mit QTextStream

Verfasst: 8. Juli 2012 18:27
von Killur
Hallo,
ich versuche den Inhalt einer Datei einzulesen, klappt eigentlich auch ganz gut, bis jetzt sieht mein code so aus:

Code: Alles auswählen

QFile f(fileName.toStdString().c_str());
    f.open(QIODevice::ReadOnly);


    QTextStream in(&f);
    QString line;
    this->lineCount = 0;


    QMessageBox msgBox;

    msgBox.addButton(QMessageBox::Yes);
    msgBox.addButton(QMessageBox::No);

 


    while(!in.atEnd())
    {
        in >> line;
        this->lineCount++;
    }


    QString c= QString::number(this->lineCount);
    msgBox.setText(c.toStdString().c_str());
    msgBox.exec();
Es gibt manchmal(nicht immer!) Verfälschungen von lineCount.
Ich habe z.b. eine Datei mit dem Inhalt:
1
2
3
4
5
6
7
8
9

Da bekomme ich 9 angezeigt. Jetzt habe ich aber eine Datei mit dem Inhalt:
1: 12

Und da bekomme ich 2 angezeigt, obwohl es nur eine Zeile ist. Es ist auch keine leere Zeile untendrunter...

Hoffentlich weis jemand weiter :)
Grüße!

Re: Probleme mit QTextStream

Verfasst: 8. Juli 2012 20:08
von Christian81
Erstmal - woher hast Du diesen Code:

Code: Alles auswählen

QFile f(fileName.toStdString().c_str());
Wer kommt auf solche Ideen? Wenn fileName schon ein QString ist - was soll das ganze (abgesehen davon dass es nur mit ASCII-Zeichen korrekt funktioniert). Das Gleiche gilt für QMessageBox::setText()
Zum anderen - solange ich die Datei nicht gesehen habe die angeblich nur eine Zeile hat, glaube ich es nicht.

Re: Probleme mit QTextStream

Verfasst: 8. Juli 2012 20:17
von Killur
Ok ich habe jetzt

Code: Alles auswählen

QFile f(fileName);
daraus gemacht (habe überall das .toStdString.c_str() entfernt). Wie soll ich dir die Datei denn zeigen?! Ich habe dir den Inhalt doch schon gesagt..
Und es funktioniert immernoch nicht.

Re: Probleme mit QTextStream

Verfasst: 8. Juli 2012 20:24
von Christian81
Wenn am Ende noch eine Leerzeile ist dann kann ich das dann sehen.

Re: Probleme mit QTextStream

Verfasst: 8. Juli 2012 22:29
von Killur
Ich habe Notepad++, damit werden rechts am Rand die Zeilen angezeigt. Soll ich noch ein Bild hochladen??

Re: Probleme mit QTextStream

Verfasst: 8. Juli 2012 22:50
von Christian81
Ist es so schwer ein minimales, kompilierbares Beispiel und die betreffende Textdatei hochzuladen? Wenn ja dann kann ich Dir leider nicht helfen. 20 Zeilen Code und eine Datei mit ein paar Zeichen... :roll:

Re: Probleme mit QTextStream

Verfasst: 9. Juli 2012 12:42
von Killur
http://www.file-upload.net/download-452 ... i.zip.html

Eine .rar Datei mit der bennanten txt Datei und dem Programm. Du must auf Seite 1 auf "Browse" klicken, die Datei auswählen und du bekommst die Anzahl der Reihen angezeigt.

Re: Probleme mit QTextStream

Verfasst: 9. Juli 2012 14:27
von brax
Ich sage mal die Antwort vorher, die Du (zu Recht) bekommen wirst:
Eine executable ist kein minimales, kompilierbares Beispiel.
Würdest Du einfach so eine Executable ausführen, die Dir irgendwer in einem Forum hochgeladen hat? Wenn die antwort "ja" lautet, solltest Du das mal überdenken... Von den armen Foristen, die kein Windows benutzen mal ganz abgesehen...

P.S.: Dein Problem ist, dass QTextStream beim ">>" Operator nicht Zeilen liest, sondern Wörter:
QTextStream & QTextStream::operator>> ( QString & str )
Reads a word from the stream and stores it in str, then returns a reference to the stream. Words are separated by whitespace (i.e., all characters for which QChar::isSpace() returns true).

Re: Probleme mit QTextStream

Verfasst: 10. Juli 2012 00:08
von Killur
Okay, und was sollte ich anstatt dem Operator >> benutzen? Sowas wie getline habe ich bei QTextStream nicht gefunden..

Re: Probleme mit QTextStream

Verfasst: 10. Juli 2012 07:44
von franzf
Das heißt readLine.
Aber nachdem du eh nichts mit dem String anfangen willst, nimm doch std::ifstream und wurschtel dich in ner Schleife mit f.ignore() durch:

Code: Alles auswählen

#include <fstream>
#include <iostream>
#include <limits>
#include <cstddef>

int main() {
    std::ifstream f("test.dat");
    std::size_t lines=0;
    while(f.ignore(std::numeric_limits<std::streamsize>::max(), '\n')) {
        ++lines;
    }
    std::cout << lines << '\n';
}
// edit:
Fehler im Code behoben: hat immer eine Zeile zu viel gezählt, da vor dem letzten ignore() der stream schon in der letzten Zeile (aber noch ok) war, und dadurch fälschlicherweise nochmal hochgezählt wurde.
Der alte (fehlerhafte) Codeabschnitt:

Code: Alles auswählen

while(f) {
    ++lines;
    f.ignore(std::numeric_limits<std::streamsize>::max(), '\n);
}