Alternative zu cin



  • Hallo,

    ich habe vor ein Konsolenprogramm zu schreiben das ähnlich der CMD.exe läuft. Dazu ist es jedoch nötig eine alternative zu cin zu kennen, die es ermöglicht, während der Benutzereingabe schon auf das Eingegebene zu reagieren (z.B. autovervollständigung mit TAB). Da aber mit cin das ganze Programm pausiert wird bis der Benutzer die Eingabe abgeschlossen hat, ist dies damit nicht möglich. Könntet ihr mir alternativen nennen mit denen dies funktioniert?

    MfG & THX,
    Hitachi



  • Sry wenn das jetzt Blödsinn ist.

    Überprüfe mit kbhit() ob eine Taste gedrückt wurde, dann lese mit getchar() das Zeichen aus.

    MfG



  • Ja danke das hat mich schon ein Stück weitergebracht. Ich habe das jetzt wie folgt realisiert:

    bool enter_pressed = false;
    char temp;
    string cmd;
    
            while (!enter_pressed)
    	{
    		if(kbhit())
    		{
    			temp = getch();
    
    			if (temp == 13) enter_pressed = true;
    			else
    			{
    				cout<<temp;
    				cmd.push_back(temp);
    			}
    
    		}
    	}
    

    Die Frage die sich mir jetzt stellt ist jedoch, wie kann ich eine Bedienung ähnlich der CMD.exe hinbekommen. Meine momentanen Hauptprobleme: Wenn ich die "Lösch" Taste drücke reagiert das Programm wie als wenn ich in CMD.exe die Pfeilnachlinks Taste drücken würde. Ich bräuchte also eine alternative zu cout<<temp; bezw. einen Befehl der ein Zeichen löscht. Ich hab schon überlegt cmd immer wieder auszugeben, weil das damit leicht zu managen ist, aber da fällt mir nix anderes ein als die ganze zeit system("cls") zu machen und das is ja auch doof vor allem weil man dann keine befehle eingegen kann da die antworten darauf sofort wieder gecleared werden würden. Gibt es vielleicht einen Befehl mit dem man immer nur die aktuelle Zeile löschen kann?
    Mein zweites Problem ist, dass wenn ich mit den Pfeiltasten navigieren will, dann kommen immer so kryptische Zeichen. Wie ist hier eine Verschiebung des Schreibkopfes zu realisieren???



  • Hitachi schrieb:

    Hallo,

    ich habe vor ein Konsolenprogramm zu schreiben das ähnlich der CMD.exe läuft. Dazu ist es jedoch nötig eine alternative zu cin zu kennen, die es ermöglicht, während der Benutzereingabe schon auf das Eingegebene zu reagieren (z.B. autovervollständigung mit TAB). Da aber mit cin das ganze Programm pausiert wird bis der Benutzer die Eingabe abgeschlossen hat, ist dies damit nicht möglich. Könntet ihr mir alternativen nennen mit denen dies funktioniert?

    In Standard C++ gibt es da keine Alternativen. Du musst wohl Betriebssystem abhängige Funktionen benutzen.



  • Ich würde das so machen :

    Du nimmst einen temporären string, wo die die gedrückten Tasten anhängst. Diesen String gibst Du immer an der gleichen Stelle aus, wenn sich was verändert hat. Die Taste Rückschritt fängst Du ab und ziehst dann ein Zeichen von diesem String ab und gibst diesen wieder aus (Gleiche Zeile und diese vorher löschen). So hatte ich mal vor Jahren eine Telnet Anwendung gemacht.



  • ja an sowas hatte ich ja auch schon gedacht. Die Frage ist nur: Wie gebe ich einen string an einer bestimmten Stelle aus???



  • Hallo

    std::string test = "Hallo";
    cout<<test[1]; //müsste a stehen
    

    chrische



  • Das ist mir schon klar. Ich meine die Stelle im Konsolenfenster. Wie kann ich die Angeben. Die Sache ist doch die: Wenn ich einen Befehl eingebe
    > call
    response
    response
    response
    > <Cursor steht hier>

    wie kann ich an der stelle des Cursors nun den String immer wieder ausgeben???



  • Mir fallen 2 Sachen ein. Entweder gehst Du mit '\r' wieder an den Anfang der Zeile oder Du benutzt das hier.

    Gruß SciFi



  • Hallo

    Sorry. Ich hatte das falsch verstanden.

    chrische



  • Ich weiss nicht ob ich dich richtig verstehe, aber versuch folgendes:
    Wenn der Anwender Backspace drückt schriebst du soetwas:

    cout<<"\b \b";
    

    \b geht ein zeichen zurück und das Leerzeichen löscht den letzten Buchstaben.


Anmelden zum Antworten