leerzeichen eingeben



  • ja, aber bei fail kann im gegensatz zu bad der stream noch gerettet werden



  • Ds ist gut zu wissen, aber dann bleibe ich in diesem Fall bei der Methode. Bei dem Programm geht es ausschliesslich darum, eine Textdatei einzulesen, auszuwerten und das Ergebnis in eine neue zu schreiben...



  • also bei mir funktionier dein schnipsel auf jedenfall



  • Ok, dann werd ich mir einfach mal den Fix installieren morgen. Ich berichte dann, obs geht.

    Vielen Dank für die ausführliche Hilfe! 🙂 👍



  • Danke Leute habt mir sehr geholfen.



  • Also der STL-Fix hat nicht wirklich geholfen. Ich installier MSVC++ nochmal ganz neu und mach den Fix rein...

    Aber ich habs mal mit dem Borland Compiler gemacht. Jetzt habe ich folgende Probleme:

    Bei der ersten Abfrage nach dem Dateiname hält er gar nicht an, damit man was eingeben kann!? Stattdessen betritt er sofort die Schleife mit der erneuten Aufforderung zur Eingabe. 😕
    Dort geht es dann, auch mit Leerzeichen. Die Abfrage ob

    dateiname == "0"
    

    ist wird dann aber anscheinend komplett übergangen. Wenn man 0 eingibt, sagt er Datei 0 kann nicht geöffnet werden, als wäre die if-Bedingung nicht da. 😕

    Man langsam bin ich echt verwirrt...ich hab auch schon versucht, vor getline mal ein

    cin.clear();
    

    zu setzen aber das hat nix geändert.

    Habe VC++6 komplett neu installiert, schmiert immernoch nach der Eingabe ab (bzw jetzt sofort, da er beim ersten getline() komischerweise nicht auf ne Eingabe wartet). Mitm Borland Compiler tritt das Porblem wie gesagt nicht auf.

    Das andere Problem besteht weiterhin (erste Eingabe wird nicht abgewartet).

    und nochmal edit: ich hoffe ich werd nich nervig....die if Abfrage geht wieder.



  • hi 🙂
    probier mal folgendes aus:

    #include<iostream> 
    #include<fstream> 
    using namespace std; 
    
    const char nl = '\n';
    
    int main () {
    
    	cout << "[O] Enter Filename: "; 
    	string dateiname; 
    	getline(cin,dateiname);
    
    	ifstream quelle(dateiname.c_str()); 
    
    	while(!quelle.is_open()) {
    		cout << "[X] Error: Unable to open file " << dateiname << "!\n";
    		cout << "[O] Enter correct Filename (0 to exit): "; 
    		getline(cin, dateiname); 
    
          if(dateiname == "0") {
          	cout << "Thank your for using our software!\n";
    			break; //irgendwie musst du ja aus der schleife rauskommen
        	} 
       	quelle.open(dateiname.c_str()); 
    	}
    }
    


  • Danke, das werd ich mal ausprobieren.

    Hehe jo in der if-Bedingung steht eigentlich ein return 1; ist hier irgendwie untergegangen *g

    Und ne Ahnung, warum es abschmiert, wenn ich es mit VC kompilier? Wie gesagt mit dem Borland gehts. Der STLfix ist fürn anderes Problem mit getline() das ich auch vorher hatte, aber den Absturz verhidnert er nicht 😞

    Und warum const char nl = '\n'? nl wird ja gar nicht verwendet im Code?

    Das Problem liegt auch vor der Schleife, die Schleife funktioniert jetzt einwandfrei, auch bei Dateinamen mit Leerzeichen und so.

    Das Problem kommt, wenn das erste Mal nach nem Dateinamen gefragt wird. Er tut so, als hätte ich schon Enter gedrückt. Vorher gibts ne switch Anweisung, bei der gibt man 1 an, dann kommt man zum gezeigten Code...

    abstürzen tut es übrigens mit nem Assertion Failure (sagt mir nix) wenn ichs mit VC compile..



  • das nl ist von nem andern code übriggeblieben.. hab nur copy &paste reingemacht 😉

    hört sich so an, als wären noch zeichen im buffer von cin.
    probier mal

    cin.ignore(1);
    //oder (sicherer)
    cin.ignore(cin.rdbuf()->in_avail());
    

    was für ne assertion schlug denn fehl?



    1. es waren noch Zeichen im Buffer

    2. cin.ignore(cin.rdbuf()->in_avail()); hat mir sehr geholfen 😃

    3. Abstürzen tuts nun auch nicht mehr 😃 😃

    DANKE DANKE DANKE. Ich weiss nicht, wie weit ich ohne dich gekommen wär. Hab hier zwar dicke Bücher, in denen ich mich nicht scheue zu lesen und google auch gern, aber die Frage war zu speziell, um da so ne Antwort drauf zu finden.

    🙂


Anmelden zum Antworten