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ß
Beliebige Zeile aus Datei aulesen
-
greenghecco
- Beiträge: 24
- Registriert: 7. Juli 2010 14:31
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Mit QFile nicht, aber vllt. mit std::ifstream + std::istream_iterator + std::advance (ungestestet).Christian81 hat geschrieben:Nein sowas geht nicht (wie auch) - nur wenn die Zeilen alle gleich lang sind.
// 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
Da muss schon etwas (also Deine Funcktion) die Datei so lange lesen, bis die 20te Zeilen gefunden wurde.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ß
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...
-
greenghecco
- Beiträge: 24
- Registriert: 7. Juli 2010 14:31
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. 
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*
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*