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.

Textdatei (10000 Zeilen) in Array schreiben

Empfohlene Antworten

  • Antworten 60
  • Ansichten 13.7k
  • Erstellt
  • Letzte Antwort
Gibt es eventuell noch andere Möglichkeiten in Kombination mit der Syntax?!

Es gibt durchaus andere Möglichkeiten, aber wie schon gesagt std::map ist genau das was Du dafür benötigst, als Anfänger solltest Du Dich evtl darin einmal einarbeiten. Wir haben Dir mit dieser Information schon die passende Datenstruktur für Dich ausgesucht....

Gut okay. Ich werds mal versuchen.

Danke für tatkräftige Unterstützung...:)!

Hallo zusammen,

bisher hat alles sehr gut funktioniert.Danke für eure Anregungen.

Nun noch eine Frage:

Wie kann ich die Ausgegebene Datei so bennen, dass der Name der Quelldatei mit eingeschlossen wird. Den Quelldateinamen schreibe ich in einen string.

Bsp.: Quelldatei: test.txt

Ausgabedatei: Auswertung_test.txt

Hallo zusammen,

ich bin soweit durch mit meinem Tool. Allerdings habe ich das Problem, das der Durchlauf des Tools bis zum Abschluss ca. 8 Minuten dauert.

Das ist eindeutig zu lange für den simplen Zeilenvergleich, auch wenn es pro Datei ca 4000 Zeilen sind.

Gibt es mögliche Verbesserungsvorschläge oder Ideen, um die Laufzeit zu verbessern?!

Auszug aus meinem Quelltext, ab der Stelle, wo das Programm meines erachtens zu lange benötigt:

//------------------------------------

//Vergleich auf Gleichheit der beiden Dateien von Datei 1 zu Datei 2

//Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei

std::ifstream final_out3("complete_out3.txt", ios::in);

//Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline3

while((!final_out3.eof()) && (getline (final_out3, newline3)))

{

std::ifstream final_out4("complete_out4.txt", ios::in);

//Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4

while ((!final_out4.eof()) && (getline(final_out4, newline4)))

{

//Vergleich der beiden eingelesenen Zeilen

if(newline3.compare(newline4) !=0)

//if(newline3!=newline4)

{

//Zähler incrementieren, um zu testen ob Zeile in beiden Dateien vorhanden ist

ungleich++;

//std::cout << " " << line << "\n" ;

//std::cout << " " << line2 << "\n" ;

}

else

{

//Wenn Exitenz nur in einer Datei, incrementiere Zähler "gleich"

gleich++;

}

}

//Abfrage, um Exitenz in beiden Dateien zu prüfen, Ausgabe wenn Pfad in zweiter Datei fehlt

if (gleich==0)

{

//std::cout << File2<<newline3<<" unequal...\n"<< std::endl;

//Ausgabe in Datei

final << File2<<newline3<<" unequal...\n"<< std::endl;

}

//Zähler gleich 0 setzen

ungleich=0;

gleich=0;

}

//--------------------------------

//Vergleich auf Gleichheit der beiden Dateien von Datei 2 zu Datei 1

//Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei

std::ifstream final_out4("complete_out4.txt", ios::in);

//Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4

while((!final_out4.eof()) && (getline (final_out4, newline4)))

{

//Einlesen der das restlichen einmalig vorkommenden Zeilen aus vorheriger Datei

std::ifstream final_out3("complete_out3.txt", ios::in);

//Abfrage auf Ende der Datei sowie einlesen jeder Zeile aus der Datei in newline4

while ((!final_out3.eof()) && (getline(final_out3, newline3)))

{

//Vergleich der beiden eingelesenen Zeilen

if(newline3.compare(newline4) !=0)

//if(newline3!=newline4)

{

//Zähler hochzählen, um zu testen ob Zeile in beiden Dateien vorhanden ist

ungleich++;

//std::cout << " " << line << "\n" ;

//std::cout << " " << line2 << "\n" ;

}

else

{

//Wenn Exitenz nur in einer Datei, incrementiere Zähler "gleich"

gleich++;

}

}

//Abfrage, um Exitenz in beiden Dateien zu prüfen, Ausgabe wenn Pfad in erster Datei fehlt

if (gleich==0)

{

std::cout << File1<< newline4<<" unequal...\n"<< std::endl;

//Ausgabe in Datei

final << File1<< newline4<<" unequal...\n"<< std::endl;

}

//Zähler gleich 0 setzen

ungleich=0;

gleich=0;

}

//std::remove("complete_out3.txt");

}

Verwende die Code-Tags, denn so ist das ganze nicht wirklich lesbar.

Du verwendest keine std::map, so wie Dir hier geraten wurde, Du hast hier einen O(n^2) Algorithmus erzeugt und damit ist die schlechte Performance erklärbar.

std::map habe ich versucht zu nutzen. Allerdings verstehe ich den map insert befehl nicht ganz.

void increment (int &i)

{

i++;

}

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

{

//Prüfung ob Zeilen den Anforderungen entspricht

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

{

increment(StrMap[line]);

StrMap.insert(pair<map<string,int>());

}

}

Was würde ich den in die Klammern des StrMap.insert einsetzen, damit die Map gefüllt wird?

Was würde ich den in die Klammern des StrMap.insert einsetzen, damit die Map gefüllt wird?
Du brauchst insert hier gar nicht.

StrMap[line] sorgt schon dafür, dass ein Eintrag für diesen Schlüssel angelegt und der Wert mit 0 initialisiert wird, falls es noch keinen gibt.

Deine increment-Funktion finde ich übrigens ziemlich merkwürdig, die macht den Code nur länger.

++StrMap[line];

tut's auch.

Nabend,

aber StrMap hat gar keine Values wenn ichs debugge...

Da passt doch was nicht^^

Mit welchem Algorithmus könnte ich die Performance steigern?!

Ich benötige einen der zwei Dateien einlesen kann und aus den jeweiligen Dateien die Zeilen vergleicht! Das ganze über verschachtelte Schleifen zu regeln, scheint ja eher suboptimal.

Mit welchem Algorithmus könnte ich die Performance steigern?!

Lies Dich doch bitte einmal in std::map ein, std::map bietet alles was Du brauchst !! Du kannst Daten einfügen, suchen, löschen und auch alle Daten nach dem Schlüssel sortiert ausgeben.

//Aufruf der Klasse map und Angabe des Namens

std::map<string,int> StrMap;

//Schleife zum Durchlauf der ersten Datei und einlesen jeder Zeile

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

{

//Prüfung ob Zeilen den Anforderungen entspricht

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

{

++StrMap[line];

//increment(StrMap[line]); //Falls Prüfung zutrifft wird die Zeile

//im ersten Durchlauf in der map angelegt, bei allen weiteren wird der Zähler erhöht

}

}

for (map<string,int>::iterator it =StrMap.begin(); it!=StrMap.end();it++)

if ((*it).second > 1)

cout << (*it).first << " " << (*it).second << endl;

map<string, int>anotherStrMap;

anotherStrMap.insert(StrMap.begin(),StrMap.find((*it).second));

Warum gibt es hier einen Fehler?!

Also in der letzten Zeile...

Fehlermeldung:

error C2664: 'std::_Tree<_Traits>::iterator std::_Tree<_Traits>::find(const std::_Tree<_Traits>::key_type &)' : cannot convert parameter 1 from 'int' to 'const std::_Tree<_Traits>::key_type &'

Sorry bin Laie im Programmieren und weiß net was du damit meinst...

das bringt mir auch nichts...wie gesagt...anfänger...

das bringt mir auch nichts...wie gesagt...anfänger...

Ich wiederhole mich: Lies Dir zu genannten Sachen die Dokumentation durch.

Mir entsteht hier der Eindruck, dass Du von uns gesagt bekommen möchtest, wie Dein Problem zu lösen ist, ohne selbst zu verstehen, wie es funktioniert

Da täuscht der Eindruck allerdings...

Das Programm läuft ja auch bereits, allerdings etwas langsam^^.

Ich habe doch bereits gesagt, dass ich mich mit std::map nicht auskenne und auch nicht verstehe wie es funktioniert, obwohl ich die Dokumentationen hoch und runter gelesen habe.

Ich habe heute den ganzen Tag versucht das Problem zu lösen, allerdings hat dies nicht geklappt.

Um das ganze nicht laufend in Dateien schreiben zu müssen, weil ich vermute das die Dateiverarbeitung dafür verantwortlich ist, dass mein Programmablauf ca. acht Minuten brauch. Ich dachte mir ich mache das statt Dateien in maps.

Bin ich auf dem richtigen Weg?Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

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.