23. November 201113 j 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.
23. November 201113 j 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.
23. November 201113 j Wenn die Zeilen länger sind, würde man die Zeile durch ein Hashverfahren jagen und dann wie gehabt, die Values dazu speichern
23. November 201113 j Kann ich die Textzeilen nicht in ein dynamisches Array einlesen und aus diesem Array dann den String raussuchen, diesen kopieren und mit den weiteren Zeilen vergleichen?
23. November 201113 j Kann ich die Textzeilen nicht in ein dynamisches Array einlesen und aus diesem Array dann den String raussuchen, diesen kopieren und mit den weiteren Zeilen vergleichen? Ein "dynamisches Array" wäre ein std::vector und würdest Du dann bitte in diesem suchen um eine bestehende Zeile zu finden?
23. November 201113 j 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
23. November 201113 j 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.
23. November 201113 j 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.
23. November 201113 j 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...
23. November 201113 j while (!f.eof()) // Solange noch Daten vorliegenKlassischer 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?
23. November 201113 j 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.
23. November 201113 j 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?
23. November 201113 j 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.
23. November 201113 j Fang mal damit an, alle Zeilen in eine std::map zu stecken, statt sie auszugeben. Für std::map brauchst du #include <map>
23. November 201113 j Ich weiß, die Frage ist OT aber dennoch: Warum C++ und nicht irgendeine nette andere Sprache (Python, Ruby, wegen meiner auch Bash und Powershell)?
30. November 201113 j 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.
30. November 201113 j Wie ich schon sagte, fang mal damit an, alle Zeilen in eine std::map zu stecken, statt sie auszugeben.
30. November 201113 j Ich bin leider C++ Anfänger, deswegen verstehe ich std::map nicht wirklich. Gibt es eventuell noch andere Möglichkeiten in Kombination mit der Syntax?!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.