Seite 1 von 1

Zeilenende in QT (QString)

Verfasst: 20. September 2006 22:41
von qstel
Hallo QT´ler,

ich habe folgende Aufgabe zu lösen: Ein Text soll zeichenweise durchsucht werden, so sollen auch Zeilenendezeichen erkannt werden. Ich habe meinen bisherigen Ansatz über QString gelöst, habe aber das Problem, dass mir das Auslesen die Zeilenenden ignoriert, also so tut, als wären sie nicht da. Es wird einfach das nächste Zeichen ausgegeben. Da ich aber u.a. bei Auftreten eines Zeilenendes eine Aktion auslösen muss, funktioniert das hier nicht.
Muss ich einen anderen Weg wählen (z.b. QTextStream oder andere) oder kann ich innerhalb eines QString ein Zeilenende erkennen?

Ich trete da im Moment ziemlich auf der Stelle. Es ist durchaus möglich, dass ich dabei auch auf der Leitung stehe. Wenn jemand von Euch mir da eine Tipp geben kann, wäre ich richtig dankbar.

Grüße Stefan

Verfasst: 20. September 2006 23:10
von qstel
Kleiner Nachsatz. Das Problem scheint nicht im QString zu liegen, da geht es durchaus. Die Zeilenenden scheinen beim Einladen verloren zu gehen:

QString loadedText;

QFile file(filename);
QTextStream in(&file);
file.open(QIODevice::ReadOnly);
while (!in.atEnd()) {
loadedText.append(in.readLine());
}

file.close();

So habe ich die Ladefunktion aufgebaut, und da sind keine Zeilenenden mehr drinne
:cry:
Also, wie gesagt, wenn jemand einen Tipp hat...

Grüße Stefan

Verfasst: 20. September 2006 23:12
von FlorianBecker
Ja, dann machst du deine Aktion eben, wenn der String zu ende ist!?

Verfasst: 21. September 2006 10:46
von qstel
Hallo Florian,

danke fuer deine Antwort. Ich glaube aber, dass ich mein Problem nicht gut genug dargestellt habe: Der einzulesende String ist ein Text in einem bestimmten Format, d.h. es gibt mehrere Zeilen, die einzeln zu erfassen sind und nur am Zeilenende zu erkennen sind. Ich muss also diesen Text auflösen in mehrere Einzelstrings. Im Ursprungstext sind die Zeilenenden vorhanden, das habe ich mit kate (KDE) als auch mit einem hex-Editor geprüft, nur nachdem einlesen sind sie halt weg.

Sorry, dass ich anscheinend zu umständlich formuliert hatte.

Verfasst: 21. September 2006 10:49
von FlorianBecker
Ja, ist doch klar, die ließt ja nur jeweils eine Zeile mit readLine!? Also Aktion nach readLine ausführen.

Verfasst: 21. September 2006 10:59
von qstel
Nochmals danke fuer deine schnelle Antwort. Das wäre ein Gedanke, würde aber einen enormen Umbau meiner Klasse erforderlich machen. Das schaue ihc mir aber auf jeden Fall an. Irgendwie bildete ich mir ein, dass es vorher schon mal mit QString funktionierte, vielleicht habe ich auch ein Speicherleck im Hirn; mal sehen was Valgrind dazu sagt... :D

Gruß Stefan

Verfasst: 21. September 2006 11:07
von tachyon
Die normalen String-I/O-Funktionen lesen doch immer genau eine Zeile ein. Nachdem Du also ein readLine gemacht hast, befindet sich genau eine Zeile in Deinem Lesepuffer und der Lesezeiger wird auf den Anfang der nächsten Zeile gesetzt.
Du kannst dann ohne Probleme die benötigten Operationen auf die eingelesene Zeile durchführen. Irgendwelche besonderen Maßnahmen brauchst Du eigentlich nicht mehr auszüführen.

Verfasst: 21. September 2006 13:26
von Emperor_L0ser
ich hab das ganze mal so gelöst, das ich mittels readAll() alles auf einmal eingelsen habe und dann in einer schleife das zeilen ende per "\n" gesucht hab, das geht sowohl unter linux wie windows und für den fall an einem windows text zu sitzen ignorierte mein programm "\r"

mfg Emperor_L0ser

Verfasst: 21. September 2006 19:35
von isifloh
hi

schon mal probiert wie von Emperor_L0ser vorgeschlagen mittels readall()
alles in einen string zu lesen und diesen dann mittels split in eine stringlist
aufzuspalten. dann hättest du jeden string einzeln und könntest problemlos die liste abarbeiten.

mfg