Ввод символов с клавиатуры в C (не в С++)

Модератор: Модераторы разделов

KDimanB
Сообщения: 143
ОС: Debian (squeeze), Slax LiveCD

Ввод символов с клавиатуры в C

Сообщение KDimanB »

Друзья.
Хотел бы на С написать простенькую ROGUE-like игрушку, а-ля ADOM, nethack и т.д.

Простой вопрос - как организовать непрерывный ввод символов с клавиатуры? Потому что scanf() это как бы не смешно, а как по-другому я не знаю.

И вопрос заочно (зависит от ответа на предыдущий) - как в таких игрушках перерисовываются экраны? Полностью, или путём вставки символов в нужные места в нужных строках (тут сразу тогда вопрос как вернуться назад по строкам)?
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Ввод символов с клавиатуры в C

Сообщение t.t »

Вам нужна библиотека ncurses.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Ввод символов с клавиатуры в C

Сообщение eddy »

Diman писал(а):
19.05.2010 21:33
как организовать непрерывный ввод символов с клавиатуры?

Элементарно:

Код: Выделить всё

int read_console(){ // считываем данные с консоли
    int rb = -1;
    struct timeval tv;
    int retval;
    tcgetattr( STDIN_FILENO, &oldt ); // открываем терминал для реакции на клавиши без эха
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    fd_set rfds;
    FD_ZERO(&rfds);
    FD_SET(STDIN_FILENO, &rfds); // 0 - стандартный вход
    tv.tv_sec = 0; tv.tv_usec = 10000; // ждем 0.01с
    retval = select(1, &rfds, NULL, NULL, &tv);
    if (retval)
        if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return rb;
}

Функция read_console() будет возвращать -1, если никаких клавиш не нажималось, или введенный символ, если что-то нажали. Естественно, опрашивать клавиатуру надо почаще. Если у вас опрос реже 100 раз в секунду, можно увеличить время ожидания tv.
А если будете использовать библиотеку ncurses (как уже сказал t.t), то можно опрашивать клавиатуру ее функцией getch. Правда, никогда этой библиотекой не пользовался, так что не могу сказать, можно ли там настроить время ожидания ввода символов.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
KDimanB
Сообщения: 143
ОС: Debian (squeeze), Slax LiveCD

Re: Ввод символов с клавиатуры в C

Сообщение KDimanB »

eddy писал(а):
20.05.2010 00:49
Элементарно

Что-то я не понимаю - там куча ошибок вылазит при компиляции (фактически все они - "undeclared (first use in this function) "). Я ещё не знаком со структурами (да и вообще только основы знаю), пока не могу понять причин.
Я сделал так:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>

int read_console();

int main()
{
    int a;

    a = read_console();

    return 0;
}

int read_console(){
... тут ваш код ...
}


t.t писал(а):
19.05.2010 21:37
Вам нужна библиотека ncurses.

Спасибо, попробую.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Ввод символов с клавиатуры в C

Сообщение NickLion »

Diman писал(а):
20.05.2010 01:44
Что-то я не понимаю - там куча ошибок вылазит при компиляции (фактически все они - "undeclared (first use in this function) "). Я ещё не знаком со структурами (да и вообще только основы знаю), пока не могу понять причин.

В таких случаях пользуются мануалами. Вот получили список ошибок:

Код: Выделить всё

main.cpp: In function ‘int read_console()’:
main.cpp:50: error: ‘STDIN_FILENO’ was not declared in this scope
main.cpp:50: error: ‘oldt’ was not declared in this scope
main.cpp:50: error: ‘tcgetattr’ was not declared in this scope
main.cpp:51: error: ‘newt’ was not declared in this scope
...

Смотрим STDIN_FILENO - какой-то макрос, oldt - переменная похоже, tcgetattr - вот, похоже на функцию, набираем man tcgetattr, получаем:
NAME
termios, tcgetattr, tcsetattr, tcsendbreak, tcdrain, tcflush, tcflow, cfmakeraw, cfgetospeed, cfgetispeed, cfsetispeed, cfse-
tospeed, cfsetspeed - get and set terminal attributes, line control, get and set baud rate

SYNOPSIS
#include <termios.h>
#include <unistd.h>

int tcgetattr(int fd, struct termios *termios_p);

int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);

Выделил жирным то, что нам нужно. В итоге добавим перед функцией:

Код: Выделить всё

#include <termios.h>
#include <unistd.h>
struct termios oldt, newt;

И всё компилится.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Ввод символов с клавиатуры в C

Сообщение eddy »

Diman писал(а):
20.05.2010 01:44
Что-то я не понимаю - там куча ошибок вылазит при компиляции

К объяснению NickLion добавлю, что если будете использовать ncurses, многие стандартные заголовочные файлы уже будут включены в вашу программу через #include <curses.h>. Причем, т.к. эта библиотека не входит в libstd, вам нужно будет при компиляции еще и указать -lncurses, иначе получите еще "загадочные ошибки".
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Ввод символов с клавиатуры в C

Сообщение IMB »

NickLion писал(а):
20.05.2010 06:09
Смотрим STDIN_FILENO - какой-то макрос, oldt - переменная похоже, tcgetattr - вот, похоже на функцию, набираем man tcgetattr, получаем:

Кстати, всё как-то не могу разобраться где хранятся man-ы по стандартным фукциям?

Shell

$ man tcgetattr No manual entry for tcgetattr

man printf

PRINTF(1) User Commands PRINTF(1) NAME printf - format and print data SYNOPSIS printf FORMAT [ARGUMENT]... printf OPTION ..........................

Что тоже явно не то.
Извиняюсь что влез с другим вопросом.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Ввод символов с клавиатуры в C

Сообщение eddy »

IMB писал(а):
20.05.2010 09:24
где хранятся man-ы по стандартным фукциям?

Они должны были входить либо в ваш пакет man-pages, либо в соответствующие devel-пакеты. Обычно это man-страницы 2 или 3 (реже - другие).
Чтобы узнать, на каких man-страницах есть интересующая вас функция, наберите whatis [функция].
Например:

Код: Выделить всё

whatis printf
printf               (1)  - format and print data
printf               (3)  - formatted output conversion
printf [builtins]    (1)  - bash built-in commands, see bash(1)

Отсюда понятно, что для вызова справки по сишной printf надо набрать man 3 printf.
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Ввод символов с клавиатуры в C

Сообщение eddy »

[offtop]
А как вы форматируете вывод терминала на форуме? Я кроме тега code ничего и придумать-то не могу :)
[offtop]
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Ввод символов с клавиатуры в C

Сообщение IMB »

О, это очень просто.

Код: Выделить всё

[sh=user]ntext[/sh]

Похоже мне не повезло.

whatis printf

printf (1) - format and print data

Интересно, какие пакеты мне надо установить, применительно к Debian? Ибо.....

Код: Выделить всё

$ apt-cache search printf
beep - advanced pc-speaker beeper
chktex - Finds typographic errors in LaTeX
coreutils - The GNU core utilities
gettext-base - GNU Internationalization utilities for the base system
gettext - GNU Internationalization utilities
libio-tee-perl - Multiplex output to multiple output handles
libprintsys-dev - printcap parser, helper for gnulpr's printfilters, dev files
libprintsys - printcap parser, helper for gnulpr's printfilters
libspf-dev - the ANSI C SPF reference library (development files)
libspf-doc - the ANSI C SPF reference library (documentation)
libspf0 - the ANSI C SPF reference library (runtime library)
libstring-format-perl - sprintf-like string formatting with arbitrary format definitions
libsys-syslog-perl - Perl interface to the UNIX syslog(3) calls
libuninum-dev - development files for Libuninum library
libuninum5 - library for handling numbers as Unicode strings
manpages-tr - Turkish version of the manual pages
mawk - a pattern scanning and text processing language
printfilters-ppd - filters from the GNUlpr printing system
librlog-dev - flexible message logging library - development files
time - The GNU time program for measuring cpu resource usage
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Ввод символов с клавиатуры в C

Сообщение watashiwa_daredeska »

eddy писал(а):
20.05.2010 09:28
Они должны были входить либо в ваш пакет man-pages, либо в соответствующие devel-пакеты.
В Дебиане (и, возможно, Убунте) есть manpages-dev.

eddy писал(а):
20.05.2010 09:34
А как вы форматируете вывод терминала на форуме? Я кроме тега code ничего и придумать-то не могу
Тег [sh=заголовок]
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Ввод символов с клавиатуры в C

Сообщение t.t »

eddy писал(а):
20.05.2010 09:28
IMB писал(а):
20.05.2010 09:24
где хранятся man-ы по стандартным фукциям?
Они должны были входить либо в ваш пакет man-pages, либо в соответствующие devel-пакеты.
В Debian, например, есть отдельный пакет manpages-dev.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: Ввод символов с клавиатуры в C

Сообщение eddy »

watashiwa_darede... писал(а):
20.05.2010 10:47
В Дебиане (и, возможно, Убунте) есть manpages-dev.

У меня не дебиан, в мандриве основные man'ы "свалены" в man-pages, а дополнительные включаются в соответствующие dev- и прочие пакеты.
watashiwa_darede... писал(а):
20.05.2010 10:47
Тег [ sh=заголовок]

Спасибо

:)
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Ввод символов с клавиатуры в C

Сообщение t.t »

IMB писал(а):
20.05.2010 10:45
Интересно, какие пакеты мне надо установить, применительно к Debian?
Кроме уже упомянутого manpages-dev, есть ещё пакет manpages-posix-dev (в non-free).
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Ввод символов с клавиатуры в C

Сообщение t.t »

eddy писал(а):
20.05.2010 09:34
[offtop]
А как вы форматируете вывод терминала на форуме? Я кроме тега code ничего и придумать-то не могу :)
[offtop]
На будущее: чтобы узнать как сделано форматирование, можно нажать "ответить" под интересующим постом. (;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Ввод символов с клавиатуры в C

Сообщение ZyX »

eddy писал(а):
20.05.2010 11:08
watashiwa_darede... писал(а):
20.05.2010 10:47
В Дебиане (и, возможно, Убунте) есть manpages-dev.

У меня не дебиан, в мандриве основные man'ы "свалены" в man-pages, а дополнительные включаются в соответствующие dev- и прочие пакеты.
watashiwa_darede... писал(а):
20.05.2010 10:47
Тег [ sh=заголовок]

Спасибо

:)


Прикольно выглядит с отключёнными картинками:
Изображение
Спасибо сказали: