Seite 1 von 1
Beliebige Zeile aus Datei aulesen
Verfasst: 3. August 2010 10:35
von greenghecco
Hallo, besteht die Möglichkeit eine beliebige Zeile aus einer Datei auszulesen. Alternativ kann ich natürlich readline mit nem integer wert bis dato machen und alles wegwerfen. Aber das erscheint mir irgendwie unelegant. Ich habe eine QFile und will direkt auf eine Zeile zb. die 20te zugreifen und diese in ein QStringArray packen.
Danke und Gruß
Verfasst: 3. August 2010 12:03
von Christian81
Nein sowas geht nicht (wie auch) - nur wenn die Zeilen alle gleich lang sind.
Verfasst: 3. August 2010 12:05
von franzf
Christian81 hat geschrieben:Nein sowas geht nicht (wie auch) - nur wenn die Zeilen alle gleich lang sind.
Mit QFile nicht, aber vllt. mit std::ifstream + std::istream_iterator + std::advance (ungestestet).
// edit:
Nö, geht nicht. Liegt daran, dass der der iterator über den operator>> geht, und der separiert nach whitespaces, und nicht nach newlines. Außerdem muss auch immer gelesen werden.
Also selber mit file.readLine() oder auch QTextStream solange vorwärts watscheln, bis du an Zeile <xyz> bist.
Re: Beliebige Zeile aus Datei aulesen
Verfasst: 3. August 2010 15:35
von thrall
greenghecco hat geschrieben:Hallo, besteht die Möglichkeit eine beliebige Zeile aus einer Datei auszulesen. Alternativ kann ich natürlich readline mit nem integer wert bis dato machen und alles wegwerfen. Aber das erscheint mir irgendwie unelegant. Ich habe eine QFile und will direkt auf eine Zeile zb. die 20te zugreifen und diese in ein QStringArray packen.
Danke und Gruß
Da muss schon etwas (also Deine Funcktion) die Datei so lange lesen, bis die 20te Zeilen gefunden wurde.
Warum aber ausgerechnet die 20te? Ist das Format der Datei immer fix? Was wenn es sich mal ändert?
Evtl. ist die Datei zu Parsen oder nach einem regulären Ausdruck zu suchen besser...
Verfasst: 3. August 2010 17:09
von greenghecco
20 war nur n Beispiel, ja ich skippe nun die Zeilen einfach immer durch. Funzt auch prima, dachte nur es gibt was eleganteres. Aber ich befürchte geht wohl nicht, sonst müsst man den Inhalt einer File ja komplett in den Stream schicken und das würde wohl der buffer nicht mitmachen. Aber tzrotzdem danke.

Verfasst: 3. August 2010 18:35
von kater
Das Problem besteht darin, dass du nicht weisst, ab welchen Byte die 20. Zeile anfängt. Also musst du sie suchen gehen. Und solange die 20. Zeile nicht immer an der selben Stelle anfängt gibt es auch keine andere Möglichkeit.
Verfasst: 1. September 2010 13:16
von guenter.w
Ehm,
Ich glaube, das Sinnvollste ist wirklich alles mit ner while-Schleife einlesen und dann in ne QStringList packen, dann kannst dir ja das 20. Element rausfischen.
Alternativ kannst du auch Zeilenumbrüche nachzählen.
Hier mal ein nicht getestes Beispiel;
QString data = file.readAll();
int i = 0;
int begin = 0;
int last = 0;
while ( i != 19 && data.indexOf("\n") != -1 ) {
beginn = data.indoexOf("\n",last+1);
last = beginn;
i++;
}
Wenn ich mich nicht vertan hab, übergeht er nun 19 Zeilenümbruche und bleibt an der 20. Stelle stehen.
Von dort aus musst du nurnoch bis zum nächsten Zeilenumbruch lesen.
Z.B.:
QString line20 = data.mid(begin+1,data.indexOf("\n",begin+1) - (begin+1));
Oh kann sein das "\n" als zwei zeichen gesehen wird, dann ist es natürlich jeweil +2
Eleganter is aber immenoch .readLine() *find*