побеге символ не является ни цифрой, ни пробелом. Таким образом, если программа получает передается символ в потоке, вы можете просто прочитать целые числа, а поток автоматически прекращает работу, когда ESPACE символы вводятся (только концентрируясь на входной стороне вопроса):
#include<iostream>
int main()
{
int c = 0;
while (std::cin >> c) {
std::cout << "c=" << c << '\n';
}
}
: Ли escape-символы пересылаются в поток операционной системой, однако возникает другой вопрос. Например, в UNIX escape-символ будет перенаправлен, но только тогда, когда ввод предоставляется программе, которая по умолчанию - это когда вводится строка. Если программе не нужно ждать ключа возврата, операционная система должна попросить не ждать ключа возврата.
Вопрос, кажется, для Windows, но я не знаю достаточно о Windows, чтобы определить, как изменить настройки терминала там (см. Ниже что-то, что может все еще работать). В UNIX вы очистите флаг ICANON
в настройках терминала, используя tcgetattr()
и tcsetattr()
. Например, вы могли бы использовать это:
#include <iostream>
#include <termios.h>
int main()
{
termios values;
tcgetattr(0, &values);
values.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &values);
int c = 0;
while (std::cin >> c) {
std::cout << "c=" << c << '\n';
}
}
Я думаю, что есть getch()
на Windows, которые получают вам один символ, не дожидаясь. Это, надеюсь, также включает в себя символ побега. Если это так, вы можете просто создать простой буфер потока вокруг getch()
и использовать это вместо того, чтобы:
#include <iostream>
#include <streambuf>
#include <whatever-declares-getch>
struct getchbuf
: std::streambuf {
static int const end = <getch()-error-value-goes-here>;
char buffer;
int underflow() {
int result(traits_type::eof());
if (this->gptr() == this->egptr() && (result = getch()) != end) {
buffer = traits_type::to_char_type(result);
this->setg(&buffer, &buffer, &buffer + 1);
}
return result;
}
};
int main()
{
getchbuf sbuf;
std::istream in(&sbuf);
int c = 0;
while (in >> c) {
std::cout << "c=" << c << '\n';
}
}
Вы должны залатать выше код, чтобы включить все, что говорит getch()
(я думаю, что это <conio.h>
, но я не знать) и указать индикатор ошибки getch()
.
Я не знаю, как проверить ключ выхода, но вам нужно переместить 'i ++' в условие 'if()', иначе вы будете считать все четные и нечетные целые числа. – Brady
Вы читаете номера, но ESC не является числом, а управляющим кодом. Я думаю, что это даже не будет передано через оператор >>. Для доступа к специальным нажатиям клавиш вам необходимо использовать какую-то функцию чтения в режиме низкого уровня. –
Брэди, это правильно о i ++, но я все еще придерживаюсь условия выхода ... –