Zeilen überspringen beim Lesen

Hallo

Gibts ne möglich beim Lesen aus einer Textdatei mittels fstream zu einer bestimmten Zeile zu springen? Performancemäßig würde das in meinem Fall sehr viel bringen, da ich die ersten ~250.000 Zeilen nicht brauche.

(Ja ich weiß, für solche Fälle sollte mensch ein Datenbankformat mit Index nehmen, allerdings ist diese Textdatei vorgegebenen ==>
macht nie Ferialjob bei nem großen sturen, microsoft-zentrierten konzern :smile:)

lg
stern

Hallo „Neutronen Stern“

Gibts ne möglich beim Lesen aus einer Textdatei mittels
fstream zu einer bestimmten Zeile zu springen?
Performancemäßig würde das in meinem Fall sehr viel bringen,
da ich die ersten ~250.000 Zeilen nicht brauche.

Wenn es kein Format mit fester zeilenlänge ist,
dann geht es nicht.

Folgende Lösung (für Performance)

  1. Dateigröße bestimmen (z.B. blocklen=15888444 Bytes)
  2. Puffer dieser Größe +1 anlegen: block = new char [blocklen+1]
  3. Puffer initialisieren: memset(block, blocklen+1, 0)
  4. Datei einlesen (Textmode): fread(block,blocklen,1,stream)
  5. Datei schliessen
  6. in block[] N mal Zeichen für ‚\n‘ in einer Schleife suchen

(Ja ich weiß, für solche Fälle sollte mensch ein
Datenbankformat mit Index nehmen, allerdings ist diese
Textdatei vorgegebenen ==>

Trotzdem kein Problem.

macht nie Ferialjob bei nem großen sturen,
microsoft-zentrierten konzern :smile:)

Welcher ist es?

Ich hab mal eine Funktion zusammengestoppelt,
die in block[] nach Zeilenwechseln sucht,
egal ob es eine Dos/Unix/bin oder sonstige
Datei ist.

Die Funktion liefert einfach bei jedem
Aufruf eine neue Zeile aus einem
Speicherblock:

 ...
 char \* pline = block;
 while(pline != 0) {
 pline = NextLineCRLF( pline );
 // mach was mit Zeile pline
 }
 ...

Vielleicht geht das ja:

 //-- In die naechste Zeile eines String-Blocks 'source' springen --
 char \* NextLineCRLF(char \*source)
{
 char \*psource=source;
 while( \*psource != '\0' ) { // block schliesst mit '\0' ab!
 // 0d..0a
 if(\*psource==0x0D) { 
 if(\*++psource==0x0A) ++psource;
 return \*psource ? psource : 0;
 }
 // 0a..0d
 else if(\*psource==0x0A) {
 if(\*++psource==0x0D) ++psource;
 return \*psource ? psource : 0;
 }
 else
 ++psource;
 }
 return \*psource ? psource : 0;
}
//- - - - - - - - - 

Grüße

CMБ

danke [owT]
.