Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Чтение из stdin только одного символа


Автор: niXman 7.10.2009, 04:00
Здравствуйте.
Подскажите, как мне реализовать следующую задачу.
   Программа, ожидает ввода символа и ентера. Но если в консоль ввести больше одного символа, то в цикле читаются они все по очереди.
   Код:
Код

for ( char ch = 0; (ch=getc(stdin)) != 'q';  ) {
    if ( ch == 'q' ) {
        return 0;
    }
}


Нужно чтоб читался только первый введенный символ.

Автор: svlary 7.10.2009, 06:09
Цитата

Программа, ожидает ввода символа и ентера.

  Это не Ваша ПРОГРАММА ждет.  Это ждет драйвер терминала, который работает в КАНОНИЧЕСКОМ режиме.. 
Если Вам реально нужен ввод с немедленной передачей нажатых клавиш в программу, то есть два решения проблемы :
1) Перевести терминал в режим сырого (Не канонического) ввода. Читайте man tcsetattr
2) Воспользоваться библиотекой ncurses или подобной.
  Первый путь сулит Вам  немало увлекательных приключений. smile 
По второму - надо просто внимательно прочитать доку по библиотеке. 

Автор: niXman 7.10.2009, 06:23
Цитата(svlary @  7.10.2009,  04:09 Найти цитируемый пост)
Если Вам реально нужен ввод с немедленной передачей нажатых клавиш в программу

Цитата(niXman @  7.10.2009,  02:00 Найти цитируемый пост)
ожидает ввода символа и ентера


Цитата(svlary @  7.10.2009,  04:09 Найти цитируемый пост)
1) Перевести терминал в режим сырого (Не канонического) ввода. Читайте man tcsetattr
2) Воспользоваться библиотекой ncurses или подобной.
  Первый путь сулит Вам  немало увлекательных приключений. smile 
По второму - надо просто внимательно прочитать доку по библиотеке.  

Ознакомлюсь...

Автор: niXman 7.10.2009, 20:56
Значит других вариантов нет?

Автор: svlary 13.10.2009, 06:16
Цитата

Значит других вариантов нет?

   Я думаю - нет.  Либо
  • Самому работать с драйвером терминала
  • Воспользоваться библиотекой для работы с терминалом
   Ну, на совсем уж крайний случай, можно попробовать получить скан-код нажатой клавиши, анализируя аппаратные порты клавиатуры, но это уже - на шибкого любителя...

Автор: Loki 13.10.2009, 15:52
есть, можно из сокета читать и там типо свой tty реализовать ну или просто свой bash на имеющемся tty.

Автор: sdukshis 18.10.2009, 10:45
Может я не правильно понял вопрос, но почему не сделать просто:
Код

char ch = getchar();
while(getchar() != '\n');

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)