Zum Inhalt springen

Textdatei (10000 Zeilen) in Array schreiben


Empfohlene Beiträge

  • Antworten 60
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

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

Geschrieben

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

Geschrieben

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");

}

Geschrieben

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.

Geschrieben

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?

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

Geschrieben

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.

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

Geschrieben

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

Geschrieben

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

Geschrieben
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

Geschrieben

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.

Geschrieben
Warum gibt es hier einen Fehler?!
Weil du in einer string-Map nach einem int suchst. std::map::find sucht nach Schlüsseln, nicht nach Werten. Was soll dieser Code überhaupt bezwecken, wofür brauchst du die zweite Map?
Geschrieben

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.

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