2009-05-12 17 views
0

Ich habe eine relativ einfache Frage. Sagen wir, ich habe eine Datei, aber ich möchte nur auf Zeile X der Datei bis Zeile Y zugreifen, was ist der einfachste Weg?Zeile X bis Zeile Y aus Datei in C++ lesen

Ich weiß, dass ich die Zeilen eins nach dem anderen lesen kann, bis ich die Zeilen erreiche, die ich eigentlich brauche, aber gibt es eine bessere, elegantere Lösung?

Danke.

Antwort

5

In C++, nein, nicht wirklich (gut, nicht in alle Sprache, die ich kenne, wirklich).

Sie müssen am Anfang der Datei beginnen, damit Sie herausfinden können, wo Zeile X startet (es sei denn, es handelt sich um eine Datei fester Länge, aber das ist unwahrscheinlich für Text).

Ebenso müssen Sie das tun, bis Sie die letzte Zeile finden Sie sich interessieren.

Sie können Zeichen anstelle von Zeilen lesen, wenn Sie von Pufferüberlauf-Exploits Angst haben, oder Sie können in festen lesen -size Block und zählen Sie die Newlines für die Geschwindigkeit, aber es läuft alles darauf hinaus, jedes Zeichen zu lesen und zu prüfen (durch Ihren Code explizit oder die Sprachbibliotheken implizit), um die Zeilenumbrüche zu zählen.

2

Suche nach \ n X mal, beginne 'lesen' (was auch immer die Verarbeitung), bis Sie die Y-X \ n oder EOF erreichen. Angenommen, neue Zeilen im Unix-Stil.

2

Da Sie in jeder Zeile Endzeilenzeichen sicherstellen müssen, um die Zeile zählen zu können, müssen Sie trotzdem über Ihre Datei iterieren. Die einzige Optimierung, an die ich denken kann, ist, die Datei Zeile für Zeile nicht zu lesen, sondern sie zu puffern und dann die Zeilen zu zählen.

4

Sie können istream :: ignore() verwenden, um das Puffern der nicht benötigten Eingabe zu vermeiden.

bool skip_lines(std::istream &is, std::streamsize n) 
{ 
    while(is.good() && n--) { 
    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    } 

    return is.good(); 
} 
+0

Gute Lösung aber ich würde wohl eine Referenz zurückgeben in den Stream statt nur seinen Status. Das wäre etwas flexibler. –

0

mit C oder C++, gibt es einige Funktionen, die Sie verwenden können, eine bestimmte Anzahl von Bytes innerhalb einer Datei zu überspringen (fseek im stdio und seekp mit iStreams und ostreams). Sie können jedoch keine bestimmte Anzahl von Zeilen angeben, da jede Zeile eine variable Anzahl von Zeichen enthalten kann und daher der korrekte Offset nicht berechnet werden kann. Eine Datei ist keine Art von Array, wo jede Zeile eine "Zeile" belegt: man muss sie eher als durchgehenden Speicherbereich sehen (Hardware wird hier nicht gedolmetscht)