Eingabe per getline() und gleichzeitig auf TAB reagieren?

partitionist

Erfahrenes Mitglied
Hallo, ich habe eine Art Shell geschrieben welche per getline() Befehle entgegenimmt und ausführt. Jetzt möchte ich wie bei Linux Shells TAB Completition einbauen also eine Art Befehls Vervollständigung. Ein Beispiel es soll "shutdown" eingeben werden:

sh[tab] = shutdown

wie man sieht werden hier zwei buchstaben eingegeben und mit der TAB Taste wird der Befehl dann vervollständigt.

Nun zu meinem Problem, ich habe ein Beispiel Code welche auch auf die TAB Taste reagiert, aber das ist wieder eine andere Eingabe Funktion und nicht die getline() mit der ich Befehle eingebe, also wie kann diese beiden verbinden?

Code:
#include <windows.h>
#include <iostream>
#include <string>

using namespace std;

bool Keypress(char &Key)
{
    INPUT_RECORD Event;
    DWORD NumberOfEvents, EventsRead, EventCounter;

    GetNumberOfConsoleInputEvents(GetStdHandle(STD_INPUT_HANDLE), &NumberOfEvents);

    if (NumberOfEvents == 0)
    return false;

    for (EventCounter = 0; EventCounter < NumberOfEvents; EventCounter++)
    {
        PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead);
        if ((Event.EventType == KEY_EVENT) && ((Event.Event.KeyEvent.bKeyDown)))
        {
            ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead);
            Key = Event.Event.KeyEvent.wVirtualKeyCode;
            if (!(FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE))))
            exit(0);
            return true;
        }
        else
        ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &Event, 1, &EventsRead);
    }
return false;
}

int main()
{
    string str;
    char key = 0;
    
    cout << "Eingabe:";
    do
    {        
        //getline(cin, str);
        
        if (Keypress(key))
        {
            if (key == VK_TAB)
                cout << "TAB";
            if (key == VK_ESCAPE)
                return 0;
        }
    }while(1);

return 0;
}
 
Hi,
also so wie das aussieht glaub ich nicht das du die beiden Funktionen kombinieren kannst. Die ReadCosoleInput liest dir alle Eingaben in die Konsole direkt ein. Musst dir wahrscheinlich eine Funktion schreiben die diese Eingaben entgegen nimmt und wieder zusammen setzt. Wüßte zumindest nicht wie das anderst gehn sollte, aber lass mich gern belehren.

Gruß Benny
 
Soll ich dann selber eine Eingabe Funktion schreiben welche auf die TAB Taste reagiert, sonst alle anderen Eingaben zusammensetzt und speichert?

Wie geht man hier am besten vor?
 
Überleg dir mal was du alles speichern musst.
Bis jetzt hast du ein komplettes Kommando wahrscheinlich in
einem Zug mit getline eingelesen. Überleg dir wie so ein Kommando
aussieht, also wie ist es zusammengeseetzt und was brauchst du um
diese Zusammensetzung zu speichern. ( zb. Parameter ).
 
Zurück