Zeilenende in QT (QString)

Alles rund um die Programmierung mit Qt
Antworten
qstel
Beiträge: 12
Registriert: 10. Februar 2006 16:34
Wohnort: Rheinhessen

Zeilenende in QT (QString)

Beitrag 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
qstel
Beiträge: 12
Registriert: 10. Februar 2006 16:34
Wohnort: Rheinhessen

Beitrag 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
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, dann machst du deine Aktion eben, wenn der String zu ende ist!?
qstel
Beiträge: 12
Registriert: 10. Februar 2006 16:34
Wohnort: Rheinhessen

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, ist doch klar, die ließt ja nur jeweils eine Zeile mit readLine!? Also Aktion nach readLine ausführen.
qstel
Beiträge: 12
Registriert: 10. Februar 2006 16:34
Wohnort: Rheinhessen

Beitrag 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
tachyon
Beiträge: 29
Registriert: 22. Juli 2006 10:03

Beitrag 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.
Emperor_L0ser
Beiträge: 51
Registriert: 28. Juli 2005 12:26
Kontaktdaten:

Beitrag 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
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

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