2 Stimmen

Zugriff auf Informationen in einer ".txt"-Datei und Wechsel zu einer bestimmten Zeile

Beim Zugriff auf eine Textdatei möchte ich aus einer bestimmten Zeile lesen. Nehmen wir an, meine Datei hat 1000 Zeilen und ich möchte Zeile 330 lesen. Jede Zeile hat eine unterschiedliche Anzahl von Zeichen und könnte möglicherweise recht lang sein (sagen wir, etwa 100.000.000 Zeichen pro Zeile). Ich denke fseek() kann hier nicht wirksam eingesetzt werden.

Ich habe über eine Schleife zur Verfolgung von Zeilenumbrüchen nachgedacht, aber ich weiß nicht genau, wie ich sie implementieren soll, und ich weiß nicht, ob das die beste Lösung wäre.

Können Sie uns helfen?

3voto

James McNellis Punkte 337231

Wenn Sie nicht über eine Art Index verfügen, der besagt, dass Zeile M an Position N beginnt, müssen Sie die Zeichen aus der Datei lesen und die Zeilenumbrüche zählen, bis Sie die gewünschte Zeile finden.

Sie können Zeilen einfach lesen mit std::getline wenn Sie den Inhalt der einzelnen Zeilen speichern wollen, oder std::istream::ignore wenn Sie den Inhalt der gelesenen Zeilen verwerfen wollen, bis Sie die gewünschte Zeile gefunden haben.

2voto

btilly Punkte 37295

Es gibt keine Möglichkeit zu wissen, wo Zeile 330 in einer beliebigen Textdatei beginnt, ohne die gesamte Datei zu durchsuchen, die Zeilenumbrüche zu finden und dann zu zählen.

Wenn Sie dies nur einmal tun müssen, dann scannen Sie. Wenn Sie es viele Male tun müssen, können Sie einmal scannen und eine Datenstruktur erstellen, in der alle Zeilen beginnen. Nun können Sie herausfinden, wo Sie suchen müssen, um genau diese Zeile zu lesen. Wenn Sie noch darüber nachdenken, wie Sie Daten organisieren können, würde ich eine andere Art von Datenstruktur für den wahlfreien Zugriff vorschlagen. Ich kann keine Empfehlung abgeben, ohne das eigentliche Problem zu kennen, das Sie zu lösen versuchen.

1voto

Felice Pollano Punkte 32046

Ich denke, Sie müssen die Datei scannen und die Anzahl der \n Vorkommen, seit Sie die gewünschte Zeile gefunden haben. Wenn dieser Vorgang häufig vorkommt und Sie der Einzige sind, der die Datei schreibt, können Sie möglicherweise eine Indexdatei führen, die solche Informationen neben der Datei mit den Daten enthält, eine Art "Arme-Leute-Index", der aber viel Zeit sparen kann.

1voto

CashCow Punkte 29849

Erstellen Sie einen Index für die Datei. Sie können dies "faul" tun, aber da Sie einen vollen Puffer lesen, können Sie ihn auch nach jedem Zeichen durchsuchen.

Wenn es sich um eine Textdatei unter Windows handelt, die ein 2-Byte ' \n ', dann ist die Anzahl der Zeichen, die Sie bis zu dem Punkt lesen, an dem der Zeilenumbruch auftritt, nicht der Versatz. Sie sollten also nach jedem Aufruf von getline() ein "seek" durchführen.

etwa so:

std::vector< off_t > lineNumbers;
std::string line;
lineNumbers.push_back(0); // first line begins at 0
while( std::getline( ifs, line ) )
{
   lineNumbers.push_back(ifs.tellg());
}

Der letzte Wert sagt Ihnen, wo EOF ist.

0voto

sashoalm Punkte 68243

Versuchen Sie zu laufen fgets in einer Schleife

/* fgets example */
#include <stdio.h>

int main()
{
   FILE * pFile;
   char mystring [100];

   pFile = fopen ("myfile.txt" , "r");
   if (pFile == NULL) perror ("Error opening file");
   else {
     fgets (mystring , 100 , pFile);
     puts (mystring);
     fclose (pFile);
   }
   return 0;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X