Zum Inhalt springen

Textdatei (10000 Zeilen) in Array schreiben


schnixx

Empfohlene Beiträge

  • Antworten 60
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Hallo,

folgendes Problem:

Ich habe eine Datei mit über 10000 Zeilen, in der mehrere Pfade enthalten sind, die sich zum Teil gleichen. Es kann also vorkommen, das in Zeile 50 und 9999 der gleiche Text steht. Ich muss diese Zeilen auswerten und eine neue Datei erstellen, in der die gleichen Zeilen mit der Anzahl an Wiederholungen aufgeführt werden.

Ich habe mir gedacht, dass ich die Textdatei erstmal in ein Array einlese. Allerdings weiß ich nicht, wie ich die unterschiedlichen langes Textzeilen in Arrays schreibe. Zudem fehlt mir der Ansatz, um aus diesem Array ein String zu ziehen und diesen mit dem weiteren Inhalt des Arrays zu vergleichen.

Bitte um Hilfe und Kommentare...

Danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Siehe oben.

Eine Möglichkeit wäre eine Map anzulegen mit der Zeile als Key und der Anzahl als Value. Wenn die Zeilen nicht all zu lang sind dürfte das auch nicht so sonderlich unperfomant sein.

Wenn die Zeilen länger sind, würde man die Zeile durch ein Hashverfahren jagen und dann wie gehabt, die Values dazu speichern
Link zu diesem Kommentar
Auf anderen Seiten teilen

Datei öffnen und in einer while-Schleife Zeile für Zeile in einen Array schreiben. Der Array sollte in ausreichender Größe definiert sein. Werden nicht alle Elemente benötigt, ist ja nicht so schlimm. Jeder String endet mit einem EOF-Zeichen, sodass die überflüssigen Elemente dahinter im späteren Programm nicht verarbeitet werden müssen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Datei öffnen und in einer while-Schleife Zeile für Zeile in einen Array schreiben. Der Array sollte in ausreichender Größe definiert sein. Werden nicht alle Elemente benötigt, ist ja nicht so schlimm.

Was soll denn dieser Murks mit Array !? Man geht davon aus, dass jede Zeile unterschiedlich lang ist und man somit nicht aus der Dateigröße errechnet werden kann, wie viele Zeilen die Datei enthält. Deshalb gibt es dynamische Strukturen:

vector - C++ Reference

map - C++ Reference

Wenn man einen Vector nimmt, dann ist die Frage nach der Aufgabenstellung, wie man eben feststellt ob schon eine Zeile vorhanden ist, d.h. "wie sucht man in der Vectorstruktur" !? Bevor ich jetzt hier anfange Suchalgorithmen zu diskutieren, nimmt man eben eine fertige Struktur und das wäre eine std::map, dort kann man immer "Paare" speichern also Text und Zahl und kann dann einfach danach suchen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

int main()

{

ifstream f;

string s;

f.open("text.txt", ios::in); // Öffne Datei aus Parameter

while (!f.eof()) // Solange noch Daten vorliegen

{

getline(f, s); // Lese eine Zeile

cout << s << endl; // Zeige sie auf dem Bildschirm

}

f.close(); // Datei wieder schließen

}

Das ist bisher mein Quelltext..

Ich bekomme die Daten der Datei ausgegeben, wie aber kann ich diese Daten weiter verwenden, sprich eine Zeile die mit "[" anfängt raussuchen, kopieren und mit den weiteren Zeilen vergleichen?

Sorry, bin gerade erst angefangen zu programmieren...

Link zu diesem Kommentar
Auf anderen Seiten teilen

while (!f.eof()) // Solange noch Daten vorliegen
Klassischer Fehler: eof liefert erst dann true, wenn das Lesen schon einmal schiefgegangen ist. Außerdem gibt es diverse andere Gründe, warum das Lesen fehlschlagen kann. Benutz getline selbst für die Schleifenbedingung: while(getline(f, s)) ...

Ich bekomme die Daten der Datei ausgegeben, wie aber kann ich diese Daten weiter verwenden

Kennst du std::map? Wenn nicht, müssen wir da etwas weiter ausholen.

sprich eine Zeile die mit "[" anfängt raussuchen, kopieren und mit den weiteren Zeilen vergleichen?
Moment, wo kommt jetzt dieses "[" her? Musst du nur bestimmte Zeilen verarbeiten? Gibt es noch andere Anforderungen, von denne du nichts gesagt hast?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein ich kenne std::map nicht...Gibt es nicht auch noch anderen Möglichkeiten dies zu realisieren?

Die Pfade die ich raussuchen und mit den anderen Pfaden vergleichen muss, beginnen alle mit einer eckiger Klammer auf! Dann folgt der Pfad, der evtl. öfters vorkommt und dann wird dieser wieder mit einer eckigen Klammer geschlossen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein ich kenne std::map nicht...Gibt es nicht auch noch anderen Möglichkeiten dies zu realisieren?
Sicher. Aber damit machst du es dir unnötig schwer.

std::map ist einer der Container der Standardbibliothek. Er speichert Schlüssel/Wert-Paare. Wenn du deine zu zählenden Zeilen als Schlüssel und die Anzahl als Wert benutzt, kannst du die Zeilen ganz einfach zählen.

std::map<std::string, int> m;
// Der Schlüssel ist std::string, der Wert ist int

++m[s]; // Erhöht den Wert für den Schlüssel s um 1.[/code]

Die Pfade die ich raussuchen und mit den anderen Pfaden vergleichen muss, beginnen alle mit einer eckiger Klammer auf! Dann folgt der Pfad, der evtl. öfters vorkommt und dann wird dieser wieder mit einer eckigen Klammer geschlossen.
Das heißt, du kannst/musst alle anderen Zeilen ignorieren?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja genau. Es kommt ein Pfad für die Registry vor und in den Zeilen darunter befinden sich dann die Values. Dann wieder ein neuer Pfad und wieder ein par Values. Mich interessieren nur die Pfade. Diese muss ich auflisten und bei gleichen Pfaden die Anzahl an Wiederholungen mit in die neue Datei schreiben.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo zusammen,

wie müsste ich es denn angehen, wenn die sich wiederholenden Zeilen zusammengefasst werden und die Anzahl an Wiederholungen hinter die entsprechende Zeile geschrieben werden?

Ausgehend von dem folgenden Quelltext:

std::ifstream in("in.txt");

std::ofstream out("out.txt");

std::string line;

while(std::getline(in, line))

{

if(line.length() > 0 && line[0] == '[')

{

out << line << '\n';

}

}

Danke im Vorraus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...