Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

mit Microsoft Visual C++

  • Antworten 60
  • Ansichten 13.6k
  • Erstellt
  • Letzte Antwort

Top-Poster 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.

Ich solls in C++machen

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?

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?

wie sollte ich es denn am besten angehen?

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

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.

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.

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...

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?

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.

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?

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.

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.

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?!

Keine Idee?

Oder gibt es keine Alternativen?

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.