getline spinnt



  • Hi,

    hab ein kleines Problem mit getline und zwar hab ich in einem Programm so ein Konstrukt:

    do
    {
    	cout << "Artikel: ";
    	wait();
    	getline(cin,artikelname);
    	if(artikelname=="exit")
    		break;
    	else vecartikel.push_back(artikelname);
    }while(true);
    

    Wenn ich die Eingabe mit cin gemacht habe war alles gut und wenn man "exit eingegeben hat wurde die Schleife auch beendet. Aber bei Artikel keonnen auch mehrer Woerte durch Leerzeichen getrennt hinein, ist ja kein problem also getline genommen. Dann ging auf einaml gar nichts mehr die Schleife war total am rumspinnen. Hab dann hier im Forum gesucht und diverse Beiträge gefunden da gab es auch diese Funktion:

    inline void wait() 
    { 
        std::cin.clear(); 
        std::cin.ignore(std::cin.rdbuf()->in_avail()); 
        std::cin.get(); 
    }
    

    Die hat auch soweit funktioniert nur nun nimmt er das "exit" nicht mehr, man kann so oft "exit" eingeben wie man will es läuft immer weiter. Was kann man dagegen tun?? Habe VC++.NET.



  • Versuch mal statt "exit" eventl. "exit\n" da ja getline() eine gesamte Zeile einliest.

    Achja und falls du das STLFix noch nicht hast und immer zweimal Enter drücken musst dann könnte es auch noch an der falschen getline()-Implementierung des MSVC (sofern der 7er überhaupt noch diesen Bug hat) liegen. Also auf jeden Fall das STLFix auf der Page von HumeSikkins (http://bens.c-plusplus.info) herunterladen.

    MfG SideWinder



  • SideWinder schrieb:

    Versuch mal statt "exit" eventl. "exit\n" da ja getline() eine gesamte Zeile einliest.

    Achja und falls du das STLFix noch nicht hast und immer zweimal Enter drücken musst dann könnte es auch noch an der falschen getline()-Implementierung des MSVC (sofern der 7er überhaupt noch diesen Bug hat) liegen. Also auf jeden Fall das STLFix auf der Page von HumeSikkins (http://bens.c-plusplus.info) herunterladen.

    MfG SideWinder

    Ne mit "exit\n" geth es leider nicht aber den Patch werde ich mal ausprobieren, besten Dank dafür.



  • Ich habe aber ähnliche Probleme zur Zeit, sehr seltsam...



  • michaelwitzik schrieb:

    Ich habe aber ähnliche Probleme zur Zeit, sehr seltsam...

    Ich finde es sehr ärgerlich, ich meine ich hab andere Probleme im Program als das ich dazu Zeit hätte mich damit zu befassen wie man eine Zeile einliest, man kann ja nicht mal einen vernünftigen Testlauf starten weil die Eingabe nicht richtig läuft das ist doch echt zum kotzen.



  • Entferne mal das cin.get() aus wait(), das hat in diesem Kontext nichts da zu suchen. Denn wenn Du das Wort 'exit' eingibst, geht das 'e' wegen cin.get() verloren. Da die übrigen Zeichen noch im Eingabepuffer stehen, läuft das Programm weiter und getline holt sich den Rest aus dem Eingabepuffer, in diesem Fall 'xit'.



  • Ja habe das cin.get() jetzt mal aus der Funktion wait() entfernt jetzt nimmt der das exit an aber man muss sozusagen immer zweimal mit Enter bestätigen, bei allen Eingaben:

    Artikel: Kreuzmutter small      //jetzt Enter
                                    //springt in eine leere Zeile wieder Enter 
    Artikel: Kreuzmutter very small //jetzt wieder Enter
                                    //wieder leere Zeile weiter mit Enter
    Artikel: exit                   //Enter
                                    //leere Zeile wieder Enter
    Programmende
    

    Kann man das auch irgendwie in den Griff bekommen ?



  • Hast Du den STLFix, den SideWinder erwähnt hat, ausprobiert? Der sollte eigentlich genau diesen Bug beheben.



  • Bei VS.NET is dieser Bug meines Wissens bereits beseitigt.

    Aber versuch mal das hier:

    do
    {
        cout << "Artikel: ";
        wait();
        getline(cin,artikelname, '\n');
        if(artikelname=="exit")
            break;
        else vecartikel.push_back(artikelname);
    }while(true);
    

    Ich habs jetzt nicht getestet, aber vielleicht bringts ja was.



  • In VC 7.1 gibt es ihn auf jeden Fall nicht mehr, bei VC 7.0 weiß ich es nicht.
    Und mit dem STLfix gehts bei VC 6.0 auf jeden Fall auch ohne Probleme.



  • Loomis schrieb:

    Bei VS.NET is dieser Bug meines Wissens bereits beseitigt.

    Aber versuch mal das hier:

    do
    {
        cout << "Artikel: ";
        wait();
        getline(cin,artikelname, '\n');
        if(artikelname=="exit")
            break;
        else vecartikel.push_back(artikelname);
    }while(true);
    

    Ich habs jetzt nicht getestet, aber vielleicht bringts ja was.

    Nein leider funktioniert es nicht das "Enter" Problem ist immer noch vorhanden.



  • Hab jetzt mal diesen VC-STL Patch eingespielt die entsprechendenen Dateien kopiert wie in der *.txt Datei stand, jetzt bekomme ich aber einen Haufen Fehlermeldungen. Muss man da noch was einstellen in VC++.NET ?



  • c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : warning C4346: '_A::size_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(610): Siehe Verweis auf Instanziierung der kompilierten Klassenvorlage 'std::basic_string<_E,_Tr,_A>'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'size_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : error C2501: 'std::basic_string<_E,_Tr,_A>::size_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : warning C4346: '_A::difference_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'difference_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : error C2501: 'std::basic_string<_E,_Tr,_A>::difference_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : warning C4346: '_A::pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'pointer'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : error C2501: 'std::basic_string<_E,_Tr,_A>::pointer': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : warning C4346: '_A::const_pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'const_pointer'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : error C2501: 'std::basic_string<_E,_Tr,_A>::const_pointer': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : warning C4346: '_A::reference': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'reference'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : error C2501: 'std::basic_string<_E,_Tr,_A>::reference': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : warning C4346: '_A::const_reference': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'const_reference'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : error C2501: 'std::basic_string<_E,_Tr,_A>::const_reference': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : warning C4346: '_A::value_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'value_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : error C2501: 'std::basic_string<_E,_Tr,_A>::value_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : warning C4346: '_A::pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : error C2144: Syntaxfehler: 'std::iterator' sollte auf ';' folgen
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : error C2698: Die using-Deklaration für 'pointer' kann nicht zusammen mit der vorhandenen using-Deklaration für 'pointer' verwendet werden
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
    CFilm.cpp
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : warning C4346: '_A::size_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(610): Siehe Verweis auf Instanziierung der kompilierten Klassenvorlage 'std::basic_string<_E,_Tr,_A>'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'size_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(39) : error C2501: 'std::basic_string<_E,_Tr,_A>::size_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : warning C4346: '_A::difference_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'difference_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(40) : error C2501: 'std::basic_string<_E,_Tr,_A>::difference_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : warning C4346: '_A::pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'pointer'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(41) : error C2501: 'std::basic_string<_E,_Tr,_A>::pointer': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : warning C4346: '_A::const_pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'const_pointer'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(42) : error C2501: 'std::basic_string<_E,_Tr,_A>::const_pointer': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : warning C4346: '_A::reference': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'reference'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(43) : error C2501: 'std::basic_string<_E,_Tr,_A>::reference': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : warning C4346: '_A::const_reference': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'const_reference'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(44) : error C2501: 'std::basic_string<_E,_Tr,_A>::const_reference': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : warning C4346: '_A::value_type': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'value_type'
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(45) : error C2501: 'std::basic_string<_E,_Tr,_A>::value_type': Fehlende Speicherklasse oder Typspezifizierer
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : warning C4346: '_A::pointer': Abhängiger Name ist kein Typ
    Präfix mit 'typename' zum Angeben eines Typs
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : error C2144: Syntaxfehler: 'std::iterator' sollte auf ';' folgen
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : error C2698: Die using-Deklaration für 'pointer' kann nicht zusammen mit der vorhandenen using-Deklaration für 'pointer' verwendet werden
    c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\XSTRING(46) : fatal error C1903: Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen.
    Generieren von Code...


Anmelden zum Antworten