Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из stdin только одного символа 
V
    Опции темы
niXman
Дата 7.10.2009, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



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

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


Нужно чтоб читался только первый введенный символ.
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
svlary
Дата 7.10.2009, 06:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

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

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



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

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


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

Ознакомлюсь...
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
niXman
Дата 7.10.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 211
Регистрация: 4.7.2009

Репутация: 1
Всего: 0



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

--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
svlary
Дата 13.10.2009, 06:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Цитата

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

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

PM MAIL   Вверх
Loki
Дата 13.10.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 244
Регистрация: 9.7.2006

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
sdukshis
Дата 18.10.2009, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.