Как читать, пока не будет нажата кнопка ESC из cin в С++

Я кодирую программу, которая считывает данные непосредственно с пользовательского ввода, и мне было интересно, как я могу прочитать все данные, пока не будет нажата кнопка ESC на клавиатуре. Я нашел только что-то вроде этого:

std::string line;
while (std::getline(std::cin, line))
{
    std::cout << line << std::endl;
}

но нужно добавить портативный способ (Linux/Windows), чтобы поймать нажатую кнопку ESC, а затем разорвать цикл while. Как это сделать?

РЕДАКТИРОВАТЬ:

Я написал это, но все же - работает, даже если я нажму кнопку ESC на клавиатуре:

#include <iostream>
#include <string>
using namespace std;

int main()
{
    const int ESC=27;
    std::string line;
    bool moveOn = true;

    while (std::getline(std::cin, line) && moveOn)
    {
        std::cout << line << "\n";
        for(unsigned int i = 0; i < line.length(); i++)
        {
            if(line.at(i) == ESC)
            { 
                moveOn = false;
                break;

            }
        }
    }
    return 0;
}

РЕДАКТИРОВАТЬ2:

Ребят, эта соулуция тоже не работает, ест первый чар из моей линии!

#include <iostream>
#include <string>
using namespace std;

int main()
{
    const int ESC=27;
    char c;
    std::string line;
    bool moveOn = true;

    while (std::getline(std::cin, line) && moveOn)
    {
        std::cout << line << "\n";
        c = cin.get();
        if(c == ESC)
            break;

    }
    return 0;
}

person Katie    schedule 08.01.2013    source источник
comment
Вы можете установить const int ESC=27;, затем использовать c=getch() в своем цикле, а затем проверить, равно ли c ESC для завершения.   -  person Maroun    schedule 08.01.2013
comment
@MarounMaroun: это не getch(); только решение для Windows...?   -  person Katie    schedule 08.01.2013
comment
используйте cin.get() вместо getch()   -  person abnvp    schedule 08.01.2013
comment
@abhinav: не работает, посмотри мое редактирование   -  person Katie    schedule 08.01.2013
comment
@Katie: Просто верни персонажа в строку.   -  person David Schwartz    schedule 08.01.2013


Ответы (4)


int main() {
  string str = "";
  char ch;
  while ((ch = std::cin.get()) != 27) {
    str += ch;
  }

 cout << str;

return 0;
}

это вводит ввод в вашу строку, пока не встретит символ Escape

person abnvp    schedule 08.01.2013

После того, как вы прочитаете строку, просмотрите все символы, которые вы только что прочитали, и найдите escape-значение ASCII (десятичное число 27).


Вот что я имею в виду:

while (std::getline(std::cin, line) && moveOn)
{
    std::cout << line << "\n";

    // Do whatever processing you need

    // Check for ESC
    bool got_esc = false;
    for (const auto c : line)
    {
        if (c == 27)
        {
            got_esc = true;
            break;
        }
    }

    if (got_esc)
        break;
}
person Some programmer dude    schedule 08.01.2013
comment
сделал, как вы сказали, не могли бы вы увидеть мою правку и сказать, работает ли она для вас? ваше здоровье:) - person Katie; 08.01.2013
comment
@Katie: вы должны получать по одному символу за раз, используя cin.get(), и прерываться всякий раз, когда видите ESC. - person abnvp; 08.01.2013
comment
@ Кэти Нет, я имею в виду, что вы должны перебрать строку line. Или читать по одному символу, используя std::cin.get(). - person Some programmer dude; 08.01.2013
comment
изменил его на: pastie.org/private/at3ujkuknnqjogqzp50gya но все равно что-то не так, как я хочу :/ он все равно съедает этот символ - person Katie; 08.01.2013

Я обнаружил, что это работает для получения ввода для клавиши escape, вы также можете определить и перечислить другие значения в функции while.

#include "stdafx.h"
#include <iostream>
#include <conio.h> 

#define ESCAPE 27

int main()
{
    while (1)
    {
        int c = 0;

        switch ((c = _getch()))
        {
        case ESCAPE:
            //insert action you what
            break;
        }
    }
    return 0;
}
person Michael Wolff    schedule 10.07.2015

Я бы посоветовал не только для символа ESC в С++, но и для любого другого символа клавиатуры на любом языке читать символы, которые вы вводите в целочисленную переменную, а затем печатать их как целое число.

Либо так, либо поищите в Интернете список символов ASCII.

Это даст вам значение ASCII ключа, а затем все просто

if(foo==ASCIIval)
   break;

Для символа ESC значение ASCII равно 27.

person Paulo    schedule 09.12.2016