Probleme mit wait() aus den FAQ um das Schliessen des Fensters zu verhindern



  • Hallo zusammen ich versuche seit kurzem C++ zu lernen, und habe nun ein kleines Problem. Nach Suchen im Forum dachte ich auch, ich hätte eine Lösung gefunden jedoch funktioniert das ganze nicht.
    Nach der Beschreibung in den FAQ sollte sie Funktion wait () Doch dazu führen, dass auf Enter gewartet wird bevor das Programm weiter läuft (in meiner Verwendung soll das schliessen des Fensters verhindert werden)
    Kann mir nun jemand sagen, was ich falsch mache?
    Zudem sollte doch die Funktion auch an anderen Stellen (z.B vor einem break in einer switch-Anweisung) oder sehe ich das falsch?

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    // Funktions-Prototypen (Deklaration)
    void console_clear();
    void wait();
    
    int main() {
    
    	  wait();
       return 0;
    }
    
    // Funktionsdefinitionen
    
    void console_clear()
    {
    # if defined(_WIN32) || defined(_WIN64)
        system("cls");
    # elif defined(_UNIX) || defined(UNIX)
        system("clear");
    # endif
    }
    
    void wait ()
    {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin.get();
    }
    

    Schon mal besten Dank für eure Hilfe



  • Hi,
    und wo ist das Problem? Konsolenfenster geht nicht allein zu oda was?



  • Nein das Konsolenfenster bleibt nicht offen, und wartet bis Enter gedrückt wird. Das Fenster wird gleich nach durchlauf der Main Funktion geschlossen, ohne dass die wait Funktion etwas ausrichtet



  • Das ist ja seltsam, bei mir wartet sie ganz brav.



  • startest du vll deine anwendung mit enter?
    falls ja: drück mal nicht so lange ;o)
    falls nein: du hast mit sicherheit irgend nen fehler beim compileren gemacht...

    bb



  • Dann dürfte es wohl daran liegen, dass ich das Menue mir Eingabe Enter beende und dann wird dieses Enter auch für wait mitgezählt.
    Nun ist blos die Frage wie ich das umgegen kann.

    Zudem wollte ich wait ebenfals in einer switch-Anweisung vor dem break einsetzen, um die zuvor eingegebenen Daten noch einmal anzeigen zu lassen und danach mit Enter wieder ins Menue zu kommen.

    switch ( varmenue2 ) {											// Switch für Menue Datenerfassung
    			case 1:
    			cout << "\t\t Fahrzeugdaten\n\n";
    			cout << "Fahrzeugname:";
    			cin >> autoname;
    			cout << "\nBesitzer des Fahrzeugs:";
    			cin >> autobesitzer;
    			cout << "\nKaufpreis des Fahrzeugs:";
    			cin >> autopreis;
    			cout << "\nTotal gefahrene Kilometer:";
    			cin >> totalkm;
    			console_clear();
    			cout << "\t\t Fahrzeugdaten\n\n";
    			cout << "Deine Fahrzeugdaten\n\n";
    			cout << "Name:" << autoname << '\n';
    			cout << "Besitzer:" << autobesitzer << '\n';
    			cout << "Kaufpreis:" << autopreis << '\n';
    			cout << "Tachostand:" << totalkm << '\n\n';
    			cout << "Weiter mit Enter!!";
    wait ();
    				break;
    			case 2:
    			cout << "\t\t Tankfuellung\n\n";
    				break;
    			case 3:
    			cout << "\t\t Versicherung/Steuern\n\n";
    				break;
    			case 4:
    			cout << "\t\t Service/Reparaturen\n\n";
    				break;
    			case 5:
    			cout << "\t\t Verbrauchsmaterial\n\n";
    				break;
    			case 7:
    			cout << "\t\t Restliche Kosten\n\n";
    				break;
    			case 8:
    			cout << "\t\t Daten korrigieren\n\n";
    				break;
    			case 9:
    				break;
    			default:
    				cout << "\n Fehler bei der Auswahl !!\n";
    		}
    	  } while (varmenue2 !=9);
    	  break;
    

    Jedoch geht es hier auch nicht, die Frage ist nun gibt es eine bessere Lösung dafür?



  • Hi,
    wenn dir eine beliebige Taste reicht nutze einfach ein

    #include <conio.h>
    getch();
    

    Damit wartet das Programm auf eine beliebige Eingabe.

    Zum Bildschirm löschen würde ich dir noch das hier empfehlen:

    void clrscr()
    {
        COORD topLeft={0,0};
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
        GetConsoleScreenBufferInfo(hOut,&csbi);
        FillConsoleOutputCharacter(hOut,' ',csbi.dwSize.X * csbi.dwSize.Y,
            topLeft,NULL);
        SetConsoleCursorPosition(hOut,topLeft);
    }
    

    Dann brauchst du nicht auf den Systembefehl zurückgreifen.
    Warum man darauf besser verzichten sollte, kann ich dir jetzt auch nicht erklären 😉

    Aber das findet man hier oft genug im Forum zum nachlesen!



  • Eingaben mache ich so in etwa ganz gern:

    string input()
    {
    	string buf;
    	buf.clear();
    	getline ( cin, buf ); 
    	return buf;
    }
    
    void menu()
    {
    	string inbuf;
    	do{
    		cout << "Type some stuff and hit enter or hit enter to quit." << endl;
    		inbuf = input();
    		if ( !inbuf.empty())
    			cout << "You have entered: " << inbuf << endl;
    	}
    	while ( inbuf.empty() == false );
    }
    
    int main()
    {
    	menu();
    	return 0;
    }
    

    Wenn es einfach nur darum geht, auf die Eingabetaste zu warten, kann man input()
    aufrufen, ohne die Rückgabe abzuholen.

    Gruß,
    B.B.


Log in to reply