wie auf tastendruck warten?



  • high!

    für meinen c++-kurs will ich jetzt lauter screenshots und so machen, wie man auf jedwelchen compilern ein hello-world-programm baut und sich es danach auch angucken kann.

    schlimmerweise machen manche beim ausführen das neu entstandene fenster so schnell wieder zu, daß man es gar nicht lesen kann. es bleibt wohl nur übrig, mit c++ auf nen tastendruck zu warten.

    da hier manche sagen, daß man nicht system("pause") oder getch() verwenden soll, wie macht man es in c++ richtig?

    ich meine mich an cin.peek() und cin.get() zu erinnern. und irgendwas.avail() war auch dabei. was soll ich einem nube vorsetzen?

    edit: disclaimer: "nube" ist nicht abwertend gemeint, "high" ist ein wortspiel, "jedwelchen" ist eine übertreibung, man kann natürlich nicht das fenster lesen, sondern den im fenster dargestellten text, es bleiben mehr möglichkeiten als die genannten übrig, ich frege nicht, weil hier manche sagen..., sondern um es perfekt zu machen, "vorsetzen" ist auch nicht abwertend gemeint, der disclaimer ist auch nur ein scherz.



  • intuitiv würde ich cin.get() nehmen (hört sich nicht so seltsam an wie peek 🙄 ).
    Der einzige Unterschied zwischen cin.get() und cin.peek() ist doch, daß get() das Zeichen aus dem Eingabepuffer nimmt und peek() nicht, oder??
    Und was ist avail()??



  • Aus meinem Tutorial:

    Unter umständen reicht ein cin.get(); nicht aus um das schließen des Fensters zu verhindern. Dann kann man mit cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); den Eingabepuffer löschen.
    Kurze Erklärung: cin.clear() versetzt cin wieder in den Ursprungsstatus (zB Fehler werden wieder zurückgesetzt). cin.ignore(cin.rdbuf()->in_avail()); löscht alle Zeichen die noch im Einagebpuffer stehen (wenn man cin.get() schreibt, und jemand gibt 2 Zeichen ein, bleibt 1 Zeichen im Puffer stehen - denn cin.get() liest ja nur eines aus).

    Meinst du sowas?



  • freshman schrieb:

    Und was ist avail()??

    IIRC leert das den Eingabe-Puffer bzw. setzt die Größe zeitweise auf 0.

    mfg



  • Shade Of Mine schrieb:

    Aus meinem Tutorial:

    Unter umständen reicht ein cin.get(); nicht aus um das schließen des Fensters zu verhindern. Dann kann man mit cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); den Eingabepuffer löschen.
    Kurze Erklärung: cin.clear() versetzt cin wieder in den Ursprungsstatus (zB Fehler werden wieder zurückgesetzt). cin.ignore(cin.rdbuf()->in_avail()); löscht alle Zeichen die noch im Einagebpuffer stehen (wenn man cin.get() schreibt, und jemand gibt 2 Zeichen ein, bleibt 1 Zeichen im Puffer stehen - denn cin.get() liest ja nur eines aus).

    Meinst du sowas?

    Hmmm...ich hab immer cin.get() gemacht und das hat auch immer wunderbar
    funktioniert. Welchen Grund gibt es, dass cin.get, wie in dem von dir
    zitierten Text beschrieben, unter Umstaenden nicht das schliessen des
    Fensters verhindert?

    [edit]
    Hat sich erledigt, cin liesst ja aus dem Puffer und unter Umstaenden stehen
    dort noch weitere Daten zur Verarbeitung an.

    Wer lesen kann ist klar im Vorteil 🙂
    [/edit]

    mfg
    v R



  • virtuell Realisticer schrieb:

    Hmmm...ich hab immer cin.get() gemacht und das hat auch immer wunderbar
    funktioniert. Welchen Grund gibt es, dass cin.get, wie in dem von dir
    zitierten Text beschrieben, unter umstaenden nicht das schliessen des
    Fensters verhindert?

    wenn ich shade recht verstanden habe, dann deswegen, weil bei einem

    int i;
    cin>>i;
    

    nebst eingabe auf tastatur von

    dies ist gar keine zahl
    

    wenigstens das d (oben im programm) gelesen wurde, abgelehnt wurde und zurück un den stream gepusht wurde. das müßte cin.get() dann lesen.
    aber evtl hat das programm sich beenden wollen, weil keine zahl kam. also cin>>i nicht brav funktionierte.
    unser "beenden" mit warten am ende müßte den schott erst noch wegmachen.



  • ka obs das ist was Du suchst...

    schau mal:

    if (!cin)
    	{
    		cin.clear();
    		cin.ignore(cin.rdbuf()->in_avail());
    		cout << "\a\nUng" << "ltige Eingabe!\n";
    	}
    


  • Also der Code

    cin.clear(); 
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();
    

    funktioniert bei mir nicht. Wenn ich 3 oder 4 Zeichen eingebe (oder mehr), liefert
    mir cin.rdbuf()->in_avail() immer 0 😕

    mfg
    v R



  • Hallo,
    die in_avail()-Variante ist leider nicht portabel. Der Grund steht im Beitrag von virtuell Realisticer. Einige Implementationen liefern leider immer 0. Alternativ geht
    cin.sync();
    cin.get();

    Und jetzt kommt das Tolle: In der Regel funktioniert die sync()-Variante nicht bei Implementationen bei denen die in_avail()-Variante funktioniert und andersherum funktioniert die in_avail()-Variante genau dort nicht, wo die sync()-Variante funktioniert.



  • Dann unter Windows wohl doch lieber:

    void wait ()
    {
        FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
        ReadConsole(GetStdHandle(STD_INPUT_HANDLE),hab keine msdn lass dir hier was einfallen);
    }
    

    Ansonsten siehe Konsolen-FAQ "Automatisches Schließen verhindern"

    MfG SideWinder



  • Wie sieht's denn eigentlich mit der klassischen

    cin.clear();
    cin.ignore(numeric_limits<streamsize>::max());
    // bzw:
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    

    Variante aus?



  • Ignoriert ignore() maximal soviele Zeichen wie da sind? Oder merkt sich der Anz-AnzDa = AnzRest und ignoriert bei der nächsten Eingabe wieder Zeichen?

    MfG SideWinder



  • SideWinder schrieb:

    Ignoriert ignore() maximal soviele Zeichen wie da sind?

    Jup. Das Problem ist nur wie das "wie da sind" implementiert wird. Einige Implementationen hören auf, sobald keine Zeichen mehr im Stream sind. Andere lesen, falls count noch nicht erreicht ist, in diesem Fall erneut von der Standardeingabe. Füllen also den Puffer neu und hören erst bei einem tatsächlichen EOF auf.



  • Hallo ihr Moderatoren!
    Was wäre denn mit der Kombination

    cin.seekg(0, ios::end); //Lesezeiger auf das Streamende setzen
    cin.get(); //...
    

    In sämtlichen Konstellationen, die ich bisher probieren konnte, hat das so funktioniert. Ist da irgendwas Gefährliches dran?



  • Könnte mir jetzt mal bitte jemand meine ernst gemeinte Frage beantworten? Würde mich nämlich wirklich interessieren...



  • Hi!

    Ich habe mal gesehen das einfach nur dies verwendet wurde und es funktioniert ebenfalls, gibt es damit irgendwie bei verschiedenen implementationen probs?:

    cin.ignore();
    

    Das wartet ja auch nur auf das Drücken der Eingabetaste.

    Code-Hacker


Anmelden zum Antworten