leerzeichen eingeben



  • dann zeig mal den code
    (ps du meinst sicher cin >> string)



  • Ja ich meine cin >> string; 🙂

    Also der ganze Code ist etwas umfangreich, hier ist der problematische Teil:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
     ifstream quelle;
     string dateiname;
    
     cin >> dateiname;
    
     quelle.open(dateiname.c_str(), ios_base::in);
    
     return 0;
    }
    

    ^^ geht aber nicht mit leerzeichen im Pfad

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
     ifstream quelle;
     string dateiname;
    
     getline(cin, dateiname);
    
     quelle.open(dateiname.c_str(), ios_base::in);
    
     return 0;
    }
    

    ^^ schmiert ab

    Ich benutze MSVC++ 6.



  • kompilier mal folgendes minimalbeispiel und probier's aus:

    #include <fstream>
    #include <string>
    using namespace std;
    
    int main () {
       string filename;
       cin >> filename;
       {
          ifstream in (filename.c_str());
       }
       {
          ifstream in ("C:\\eine datei mit leerzeichen.blabla");
       }
       getline(cin,filename);
       {
          ifstream in (filename.c_str());
       }
    }
    

    schmiert das ab? wo?



  • Das sieht gut aus, das werd ich gleich mal ausprobieren.

    Hmnö, das schmiert nicht ab. Dann muss ich wohl nochmal jede Zeile durchgehen bei mir. Danke für die Hilfe erstmal!

    edit: Ist ja schon etwas anders... :

    ...
             ifstream quelle;
             string dateiname;
    ...
    
    			cout << "[O] Enter Filename: ";
    			getline(cin,dateiname);
    			cout << endl;
    
    			quelle.open(dateiname.c_str(), ios_base::in);
    			while(!quelle)
    			{
    				quelle.clear();
    				cout << "[X] Error: Unable to open file " << dateiname << "!" << endl;
    				cout << "[O] Enter correct Filename (no spaces! 0 to exit): ";
    				getline(cin, dateiname);
    				cout << endl;
    				if(dateiname == "0")
    				{
    					cout << endl << "Thank your for using our software!" << endl;
    				}
    				quelle.open(dateiname.c_str(), ios_base::in);
    			}
    

    so siehts bei mir aus...sollte ich es vielleicht mit

    quelle in (dateiname.c_str());
    

    versuchen? Das sieht aber komisch aus... 😕



  • wenn dann mit

    ifstream quelle(dateiname.c_str());
    

    das ios_base::in kannst du dir bei ifstreams aber sowieso sparen.

    hast du dir den stlfix runtergeladen, zu dem ich ein paar beiträge weiter oben einen link gepostet hab?

    in der schleife scheinst du prüfen zu wollen, ob die datei korrekt geöffnet wurde. nimm dazu die funktion is_open!



  • Ich komme ganz gut zurecht mit MSVC++ 6. Was genau hat der STLFix für Vorteile?

    Ist mein Beispiel oben denn soweit korrekt? Wie gesagt, mit cin >> dateiname; funktioniert es...würde mich echt interessieren, warum nicht mit getline(cin, dateiname);

    Ich verwende die !quelle Bedingung um zu prüfen ob die Datei geöffnet ist. Habe dieses Vorgehen aus M+T easy c++ von Dirk Louis. Hat das Nachteile?

    Die Schleife dient einfach dazu, den Benutzer solange nach dem korrekten Dateinamen bis er 0 eingibt oder sich nicht mehr vertippt...



  • in der STL version, die der MSVC6 standardmäßig dabei hat, sind einige fehler enthalten, und sie ist nicht besonders gut optimiert.

    ! prüft dens stream auf fail() und das kann auch andere bedeutungen haben.



  • Ach jetzt versteh ich das mit dem STLfix, dachte das wärn Compiler... *schnellmerker. Ich zieh ihn mir gleich, für heute hör ich auf, mache morgen weiter...

    Aber wenn der Stream fail() ist gibt es doch auf jeden Fall Probleme mit dem Lesen aus der Datei, oder?



  • 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