Zum Inhalt springen

schnixx

Mitglieder
  • Gesamte Inhalte

    84
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von schnixx

  1. Ja es handelt sich immer noch um den gleichen Thread. Code-Tags habe ich leider noch nicht berücksichtigt und und printf bzw. cout werde ich im Anschluss synchronisieren. /Hauptprogramm int _tmain() { //Datum- und Zeifunktion zur Angabe der Bearbeitungszeit time_t t; time(&t); int select=0; //String für Eingabe der Datei string eingabe; string eingabe2; printf("###################################################################\n\n"); printf("In the following tool you insert files for comparison.\n"); printf("Please pay attention that both files exist...\n\n"); printf("###################################################################\n"); printf("##############################KONTEXTMENU##########################\n"); printf("## [1]Only show multiple path ##\n"); printf("## [2]Only show single path ##\n"); printf("## !!Other entries cause an exit!! ##\n"); printf("###################################################################\n"); printf("###################################################################\n"); printf("Enter a number to select a choice: "); scanf("%i",&select); getchar(); if (select==1 || select ==2 ) { std::ifstream in; do { printf("Please enter the first file for analyzing: \n"); cin >> eingabe; //Einlesen der Datei std::ifstream in(eingabe.c_str(), ios::in); if (!in) { cerr<<"ERROR! Cannot open "<<eingabe<< "\n\n"; } cout << in.good() << endl; //Abfrage ob Dateien vorhanden if (in.good()==0) cout << "schleife" << endl; }while((int)in.good()==0); printf("Please enter the second file for analyzing: \n"); cin >> eingabe2; //Einlesen der Datei std::ifstream in2(eingabe2.c_str(), ios::in); if (!in2) { cerr<<"ERROR! Cannot open "<<eingabe2<< "\n\n"; } } else { cout << "CANCEL AND EXIT..."<< endl; exit(-1); } //-------------------------------------------------------------- //Deklaration zum Auslesen der Zeilen std::string line; std::string line2; std::ifstream in(eingabe.c_str(), ios::in); std::ifstream in2(eingabe2.c_str(), ios::in); //Aufruf der Klasse map und Angabe des Namens std::map<string,int> StrMap; std::map<string,int> StrMap2; //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] == '[') { //Falls Prüfung zutrifft wird die Zeile im ersten Durchlauf in der map angelegt, //bei allen weiteren wird der Zähler erhöht ++StrMap[line]; } } //Schleife zum Durchlauf der ersten Datei und einlesen jeder Zeile while(std::getline(in2, line2)) { //Prüfung ob Zeilen den Anforderungen entspricht if(line2.length() > 0 && line2[0] == '[') { ++StrMap2[line2]; //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 } }
  2. Morgen, hab mal wieder ne Frage...! Wieso springt das Programm nicht aus meiner Schleife raus, obwohl die Bedingung erfüllt wird (Datei ist im Quellvz vorhanden und somit ist in.good=1). Ich zuerst eine Datei an, die nicht vorhanden ist, der Aufruf wiederholt sich und ich gebe erneut an Datei an, die nicht vorhanden ist. Nun möchte ich den positiven Fall testen und gebe eine Datei an, die vorhanden ist. Allerdings findet die Schleife keinen Abschluss. Quelltext: printf("Enter a number to select a choice: "); scanf("%i",&select); getchar(); if (select==1 || select ==2 ) { std::ifstream in; do { printf("Please enter the first file for analyzing: \n"); cin >> eingabe; //Einlesen der Datei std::ifstream in(eingabe.c_str(), ios::in); if (!in) { cerr<<"ERROR! Cannot open "<<eingabe<< "\n\n"; /* printf("Please enter the first file for analyzing: \n"); cin >> eingabe; */ //exit(-1); } cout << in.good() << endl; //Abfrage ob Dateien vorhanden if (in.good()==0) cout << "schleife" << endl; }while(!in.good()==0);
  3. Bin ich auf dem richtigen Weg?Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen?
  4. 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.
  5. 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.
  6. das bringt mir auch nichts...wie gesagt...anfänger...
  7. 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...
  8. //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?!
  9. 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.
  10. Nabend, aber StrMap hat gar keine Values wenn ichs debugge... Da passt doch was nicht^^
  11. 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?
  12. std::map habe ich versucht zu nutzen. Allerdings verstehe ich den map insert befehl nicht ganz.
  13. 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"); }
  14. 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
  15. Gut okay. Ich werds mal versuchen. Danke für tatkräftige Unterstützung...!
  16. Keine Idee? Oder gibt es keine Alternativen?
  17. 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?!
  18. 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.
  19. Ja genau. Es gibt in der Eingabedatei mehrere gleiche Zeilen, genauer gesagt gleiche Pfade (Ein Pfad steht immer in einer Zeile und beginnt mit '['). Diese müssen gezählt werden und in der Ausgabedatei mit angegeben werden. Beispiel: [Pfadangabe] Wiederholungen: 2 Wächst in deinem Beispiel die Ausgabedatei dynamisch? Können dort also beliebig viele Zeilen geschrieben werden?
  20. Die Datei soll zeilenweise durchlaufen werden...
  21. Es handelt sich um eine Textdatei die beliebig viele Zeilen hat. Diese beginnen teilweise mit einem eckigen Klammer auf. Beginnt eine Zeile mit dieser Klammer muss ich diese selektieren und in eine neue Datei schrieben.
  22. Ich möchte ein Object anlegen, dass mir eine Datei in beliebiger Länge fortsetzend schreibt. Zuvor wird eine Datei durchlaufen, aus der Zeilen selektiert werden, die dann in eine neue Datei geschrieben werden. Welches Object kann ich nutzen und wie würde ich vorgehen? Bin leider noch Anfänger in C++. Danke für Infos.
  23. Object und fortlaufende Datei zu erstellen.

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