Невозможно получить следующую команду пользователя сразу после того, как функция consoleHandler получит Ctrl-C от пользователя - PullRequest
0 голосов
/ 12 апреля 2019

Я пишу крошечную оболочку для моего предмета, и мне нужно поймать Ctrl-C и обработать ее.У меня есть бесконечный цикл для получения пользовательских команд, пока они не наберут «выход».Когда я не набрал Ctrl-C, все в порядке, моя программа получает команду пользователя и обрабатывает ее одну за другой.Но когда я набираю Ctrl-C, моя программа не получает никаких пользовательских команд с того времени.И у меня есть бесконечный цикл, но я не могу ничего печатать, кроме Ctrl-C.

Я пытаюсь поместить fflush (stdin) в начало getline, но это не работает.Я пытаюсь перечислить все темы в процессе, и это всегда один.Всегда есть одна нить.

#include<iostream>
#include<windows.h>
#include<stdio.h>
#include<stdio.h>
#include<tchar.h>
#include<psapi.h>
#include<vector>
#include<string>
using namespace std;

BOOL WINAPI consoleHandler(DWORD signal)
{
   if(signal == CTRL_C_EVENT)
      cout << "^C";
   return TRUE;
}

int main()
{
   SetConsoleCtrlHandler(consoleHandler, TRUE);
   string userInput;
   while(true)
      getline(cin, userInput);

return 0;
}

Ожидайте: после того, как я наберу консоль CTRL-C, напечатайте «^ C», и программа получит мою следующую команду

1 Ответ

1 голос
/ 12 апреля 2019

Ваш входной поток имеет бит ошибки, установленный после отправки Ctrl-C. Вам нужно очистить его, иначе std :: getline не будет читать символы из потока и просто вернет:

BOOL WINAPI consoleHandler(DWORD signal)
{
    if (signal == CTRL_C_EVENT)
    {
        std::cout << "^C\n";
        std::cin.clear();
    }
    return TRUE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...