Klotzkopp Geschrieben 8. Dezember 2011 Geschrieben 8. Dezember 2011 Bin ich auf dem richtigen Weg?Keine Ahnung. Du hast immer noch nicht gesagt, wozu du die zweite Map brauchst. Wenn da dasselbe drinstehen soll wie in der ersten, ist sie überflüssig. Ist das überhaupt möglich. Inhalt einer map in eine andere map einzufügen?Wenn die Templateparameter gleich sind, kannst du einfach zuweisen. Zitieren
schnixx Geschrieben 13. Dezember 2011 Autor Geschrieben 13. Dezember 2011 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); Zitieren
Klotzkopp Geschrieben 13. Dezember 2011 Geschrieben 13. Dezember 2011 hab mal wieder ne Frage...!Geht es immer noch um "Textdatei in Array schreiben"? Falls nicht, mach bitte einen neuen Thread dafür auf. Ein Thema - ein Thread. Wieso springt das Programm nicht aus meiner Schleife raus, obwohl die Bedingung erfüllt wirdZeig bitte mal das ganze Programm, eigentlich sollte sich das nicht übersetzen lassen, es sei denn, es gibt da noch eine andere Variable namens in. Du kannst in der Schleifenbedingung einer do/while-Schleife nicht auf eine Variable zugreifen, die innerhalb des Schleifenblocks definiert ist. Und benutz bitte Code-Tags, damit die Einrückung erhalten bleibt. Und misch nicht printf/scanf und cin/cout, die müssen nicht gegeneinander synchronisiert sein. Zitieren
schnixx Geschrieben 13. Dezember 2011 Autor Geschrieben 13. Dezember 2011 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 } } Zitieren
Thelvan Geschrieben 13. Dezember 2011 Geschrieben 13. Dezember 2011 Denkst du gerade Code-Tags wäre ein Sprach-Feature? Code-Tags sind hier im Forum eine Funktion, um den Code besser formatiert darzustellen. Zitieren
schnixx Geschrieben 13. Dezember 2011 Autor Geschrieben 13. Dezember 2011 okay.werd ich beim nächsten Mal einhalten;). Zitieren
Klotzkopp Geschrieben 13. Dezember 2011 Geschrieben 13. Dezember 2011 std::ifstream [B][COLOR="red"]in[/COLOR][/B]; do { printf("Please enter the first file for analyzing: \n"); cin >> eingabe; //Einlesen der Datei std::ifstream [B][COLOR="blue"]in[/COLOR][/B](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)[COLOR="red"]in[/COLOR].good()==0);[/code] Da haben wir's doch: Du hast 2 Variablen namens in, eine außerhalb der Schleife (rot markiert) und eine innerhalb. In der Schleifenbedingung ist die blaue aber nicht mehr gültig, also wird dort die rote benutzt. Damit hast du nie etwas gemacht, also liefert good hier immer false. Code-Tags bedeutet, dass du um den Code hier im Forum solche Markierungen setzt: [CO[size=2]D[/size]E]Hier der Code[/CO[size=2]D[/size]E]. Dann passt's auch mit der Formatierung. Zitieren
schnixx Geschrieben 13. Dezember 2011 Autor Geschrieben 13. Dezember 2011 Okay.aber das rote in kann ich ja nicht entfernen, da es sonst innerhalb der Bedingung als undeclared identifier gilt. Zitieren
Klotzkopp Geschrieben 13. Dezember 2011 Geschrieben 13. Dezember 2011 Okay.aber das rote in kann ich ja nicht entfernen, da es sonst innerhalb der Bedingung als undeclared identifier gilt.Das ist eine unsinnige Begründung. Mit dem roten in erreichst du nur, dass dein Programm zwar übersetzt werden kann, aber trotzdem nicht funktioniert. - Das rote "in" muss weg. - Das blaue "in" muss in der Schleife bleiben. - Du brauchst die Statusinformation des blauen "in" in der Schleifenbedingung. Lösung: Leg außerhalb der Schleife eine bool-Variable an, die den Rückgabewert von in.good() in der Schleife speichert. Diese Variable kannst du dann für die Schleifenbedingung nutzen. Warum überhaupt der Cast auf int? Angst vor bool? Zitieren
schnixx Geschrieben 13. Dezember 2011 Autor Geschrieben 13. Dezember 2011 Okay. Hat super funktioniert.Danke Zitieren
Empfohlene Beiträge
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.