Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Аналог getch() в С++

3.3K
01 октября 2006 года
ShadyMan
191 / / 15.07.2006
Подскажите неграмотному в Плюсах сишнику, есть ли в С++ какие-то свои методы для выполнения действий, которые в С выполняются с помощью функций getch() и clrscr().
Страницы:
2
01 октября 2006 года
squirL
5.6K / / 13.08.2003
std::cin.get()
3.3K
01 октября 2006 года
ShadyMan
191 / / 15.07.2006
Твоё великодушие, squirL, меня поражает (серьёзно). Только cin.get() - это всё-таки не то. Нужно, чтобы символ считывался сразу - без ожидания нажатия энтера.
2
01 октября 2006 года
squirL
5.6K / / 13.08.2003
если без нажатия Enter - то это от ОС зависит. в стандарте С++, насколько мне известно, такой фичи нет, ибо это платформо-зависимая весчь. в POSIX совместимых осях, например, такой функции и в С нету. либо самостоятельная реализация, либо в виде внешних библиотек типа ncurses. вот тут http://forum.codenet.ru/showthread.php?t=29717 мы это обсуждали.
так же глянь http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.17
Цитата:

Твоё великодушие, squirL, меня поражает


мусор за пределы гостевой книги не выношу. и тебе не советую.

3.3K
02 октября 2006 года
ShadyMan
191 / / 15.07.2006
Вторая ссылочка особенно хороша - что не вопрос, то ответ: "This is not a standard C++ feature...", потому что вдруг у вас нет монитора, вдруг и клавиатуры нет. А если и компьютера нет? Прям как в "Мастере и Маргарите": "что же это у вас, чего ни хватишься, ничего нет!"
Уточняю вопрос: речь не идёт о Linux и проч. Я хотел узнать только на счёт консольных приложений Windows и DOS.
547
03 октября 2006 года
Hydra
488 / / 20.06.2006
Так а чем тебе в консольных виндовс getch() не нравится? Или getchar()/getwchar()?
2
03 октября 2006 года
squirL
5.6K / / 13.08.2003
[quote=ShadyMan]Вторая ссылочка особенно хороша - что не вопрос, то ответ: "This is not a standard C++ feature..."
[/quote]
:D

а ты не заметил, что все С++ ники жуткие приверженцы стандартов? ;)

нету такой фичи. так что оставайся с getch(). либо копай MSDN на предмет соответствующих Win32 API - только это уже не будет С++.
3.3K
03 октября 2006 года
ShadyMan
191 / / 15.07.2006
[QUOTE=Hydra]Так а чем тебе в консольных виндовс getch() не нравится? Или getchar()/getwchar()?[/QUOTE]
Да нет, мне-то как раз нравится. Просто на форуме так часто слышатся упреки в адрес начинающих и не очень от аксакалов программирования по поводу смешения стилей С и С++, что хотелось прояснить этот вопрос. Вдруг там есть какие-нибудь специфические финты вокруг cout, позволяющие не использовать getch. А вообще это разделение на стиль С и С++ мне не совсем ясно. Например, чем принципиально отличается использование оператора new от вызова функции malloc? Тем более, что в конечном итоге выделение памяти всё равно должно производиться именно операционной системой и непосредственно средствами языка или среды программирования эта задача не может быть решена.
1.9K
03 октября 2006 года
[*]Frosty
278 / / 17.06.2006
Цитата:
А вообще это разделение на стиль С и С++ мне не совсем ясно. Например, чем принципиально отличается использование оператора new от вызова функции malloc?


+ в new используються исключения;
+ new это оператор, с вытекающими плюсами;
+ в манах пишут new лучше, чем malloc);:)

3.3K
03 октября 2006 года
ShadyMan
191 / / 15.07.2006
[QUOTE='
  • Frosty']+ в new используються исключения;[/QUOTE]
    Имеется в виду try - catch?
    [QUOTE='
  • Frosty']+ new это оператор, с вытекающими плюсами;[/QUOTE]
    Так какими же всё-таки плюсами?
  • 1.9K
    03 октября 2006 года
    [*]Frosty
    278 / / 17.06.2006
    Цитата:
    Имеется в виду try - catch?


    Ты правильно понял.
    А плюсы от оператора, ну например - возможность перегрузки для отдельного типа.

    22K
    03 октября 2006 года
    Krush
    1 / / 03.10.2006
    Cамое выжное различие между new и delete, это то, что оператор new вызывает конструктор, а new[] - конструкторы создаваемых объектов.
    malloc этого естественно не делает.
    3.3K
    04 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Krush]Cамое выжное различие между new и delete, это то, что оператор new вызывает конструктор, а new[] - конструкторы создаваемых объектов.
    malloc этого естественно не делает.[/QUOTE]
    А вот это уже интересно. Спасибо, наконец-то весомый аргумент.
    547
    05 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Кстати,
    Цитата:

    getchar is a macro that returns the next character on the named input stream stdin. It is defined to be getc(stdin).


    Так что, похоже, C++

    3.3K
    05 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    Ну да, макрос.
    [QUOTE=Hydra]Так что, похоже, C++[/QUOTE]Что вы этим хотели сказать, если не секрет?
    547
    06 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Опречделен через stdin, который является стандартным потоковым классом, т.е. относится к C++
    351
    06 октября 2006 года
    PitxBull
    633 / / 22.12.2004
    [QUOTE=ShadyMan]Да нет, мне-то как раз нравится. Просто на форуме так часто слышатся упреки в адрес начинающих и не очень от аксакалов программирования по поводу смешения стилей С и С++, что хотелось прояснить этот вопрос. Вдруг там есть какие-нибудь специфические финты вокруг cout, позволяющие не использовать getch.[/QUOTE]
    судя по всему с точки зрения аксакалов и написателей стандартов С++ - чтение символов без Enter - не в стиле С++. гыг-гыг.
    5.4K
    06 октября 2006 года
    Svyatozar
    221 / / 11.09.2006
    [QUOTE=PitxBull]судя по всему с точки зрения аксакалов и написателей стандартов С++ - чтение символов без Enter - не в стиле С++. гыг-гыг.[/QUOTE]
    Вовсе нет, просто исторически так сложилось что режимом ввода символов управлял железный терминал для которого основной режим ввода именно построчный...
    3.3K
    06 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Hydra]Опречделен через stdin, который является стандартным потоковым классом, т.е. относится к C++[/QUOTE]
    Извините, но это чушь собачья. getc, как и getch - функции стандартной библиотеки С. stdin всего лишь стандартный поток для ввода и имеет тип *FILE (FILE - это структура такая, а вовсе не класс).
    21K
    06 октября 2006 года
    Nuller_
    6 / / 06.10.2006
    deleted
    5.4K
    07 октября 2006 года
    Svyatozar
    221 / / 11.09.2006
    [QUOTE=ShadyMan]Извините, но это чушь собачья. getc, как и getch - функции стандартной библиотеки С.[/QUOTE]
    функция getch не является стандартом С. В Винде она в conio.h, а в Юниксе только в curses.h и то не совсем то же самое
    351
    07 октября 2006 года
    PitxBull
    633 / / 22.12.2004
    [QUOTE=Svyatozar]Вовсе нет, просто исторически так сложилось что режимом ввода символов управлял железный терминал для которого основной режим ввода именно построчный...[/QUOTE]
    мне как конечному пользователю совершенно начхать что и как там сложилось исторически... мне нужен удобный и простой набор функций явным и простым образом покрывающий все множество возникающих задач... вчера 2 часа провозился с потоковой библиотекой STL потом плюнул и переписал за 20 минут на WinAPI.... конечно я просто устал к утру , но помоему STL - явно криво спроектирована...
    5.4K
    07 октября 2006 года
    Svyatozar
    221 / / 11.09.2006
    [QUOTE=PitxBull]мне как конечному пользователю совершенно начхать что и как там сложилось исторически... мне нужен удобный и простой набор функций явным и простым образом покрывающий все множество возникающих задач...[/QUOTE]
    Дык, всем это нужно. Найди хорошую библиотеку функций. Я сам такую ищу. Эх "есть женщины в Русских селеньях. Еще бы туда мужиков...". Только давай уж не будем о грустном.

    [QUOTE=PitxBull]вчера 2 часа провозился с потоковой библиотекой STL потом плюнул и переписал за 20 минут на WinAPI.... конечно я просто устал к утру , но помоему STL - явно криво спроектирована...[/QUOTE]
    Насчет кривости STL скажу по секрету шепотом: (полностью согласен). c iostream я тоже изрядно попарился, оно вроде и удобно для некоторых целей (перегружаемый оператор <<) да глючит: не всегда могу заставить компилятора использовать этот перегруженный оператор...
    3.3K
    08 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Svyatozar]функция getch не является стандартом С. В Винде она в conio.h, а в Юниксе только в curses.h и то не совсем то же самое[/QUOTE]
    Разве конкретные функции вообще могут быть стандартом языка? Я говорил не о стандарте языка, а о стандартной библиотеке. Если getc используется и в Windows и в Unix, а getch - всего лишь макрос, основанный на getc, то какая разница, прописана getch в стандартных заголовочных файлах или нет? Другое дело, что работают эти функции в Unix не так, как в Windows.
    5.4K
    09 октября 2006 года
    Svyatozar
    221 / / 11.09.2006
    [QUOTE=ShadyMan]...getch - всего лишь макрос, основанный на getc, то какая разница, прописана getch в стандартных заголовочных файлах или нет?[/QUOTE]Нет, функция консольной досовской conio.h библиотеки getch и стандартная stdio.h функция getc - совершенно разные вещи. getc читает следующий символ с указанного входного потока (в отличии от getchar), а getch - это функция досовской консоли, которая ждет нажатия клавиши и не выводя ничего на экран возвращает программе ее значение.
    547
    09 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Цитата:

    Извините, но это чушь собачья. getc, как и getch - функции стандартной библиотеки С. stdin всего лишь стандартный поток для ввода и имеет тип *FILE (FILE - это структура такая, а вовсе не класс).


    из stdio.h

     
    Код:
    #ifdef __cplusplus
    #define stdin   (&std::_streams[0])
    #define stdout  (&std::_streams[1])
    #define stderr  (&std::_streams[2])
    #else
    #define stdin   (&_streams[0])
    #define stdout  (&_streams[1])
    #define stderr  (&_streams[2])
    #endif
    240
    09 октября 2006 года
    aks
    2.5K / / 14.07.2006
    [QUOTE=ShadyMan]Разве конкретные функции вообще могут быть стандартом языка? [/QUOTE]
    Конечные функции могут воходить в стандартные библиотеки и определенны стандартом, как обязательные.
    А Svyatozar прав, conio.h и getch() - это досовская библиотека и функция никогда не входившая в этот стандарт.
    3.3K
    09 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Svyatozar]Нет, функция консольной досовской conio.h библиотеки getch и стандартная stdio.h функция getc - совершенно разные вещи.[/QUOTE]
    Тю-блин, совсем меня запутали. Это всё Hydra начал про макросы писать, а я и перепутал getch и getchar. Это getchar - макрос getc. Всё правильно, беру свои слова обратно.

    [QUOTE=Hydra]из stdio.h
     
    Код:
    #ifdef __cplusplus
    #define stdin   (&std::_streams[0])
    #define stdout  (&std::_streams[1])
    #define stderr  (&std::_streams[2])
    #else
    #define stdin   (&_streams[0])
    #define stdout  (&_streams[1])
    #define stderr  (&_streams[2])
    #endif
    [/QUOTE]
    Ну и что вы меня своим stdio.h пугаете? А у меня в нём прописано так:
     
    Код:
    extern FILE (*_imp___iob)[];
    #define _iob    (*_imp___iob)
    #define stdin  (&_iob[0])
    #define stdout (&_iob[1])
    #define stderr (&_iob[2])

    Если у вас компилятор C++, то в нём хоть всё на свете может определяться через классы, но это же не значит, что до C++ не существовало функций, ориентированных на стандартный ввод и вывод.
    547
    10 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Цитата:

    Если у вас компилятор C++, то в нём хоть всё на свете может определяться через классы, но это же не значит, что до C++ не существовало функций, ориентированных на стандартный ввод и вывод.


    Тогда не совсем понятен исходный вопрос (см. subj). Если его понимать буквально, то есть, ибо getchar() макрос аналогичный getch() реализованный с помощью потоковых классов.
    А так, в итоге, все в машинный код превращается, и механизмы работы практичеcки любой программной реализации там выглядят одинаково (коды символов, матод получения символа на уровне архитектуры контупера и т.д.)

    240
    10 октября 2006 года
    aks
    2.5K / / 14.07.2006
    [QUOTE=ShadyMan]Если у вас компилятор C++, то в нём хоть всё на свете может определяться через классы, но это же не значит, что до C++ не существовало функций, ориентированных на стандартный ввод и вывод.[/QUOTE]
    Вопрос же был про getch() в С++. А в С++ многие функции из библиотеки С переопределенны.
    17K
    10 октября 2006 года
    _mrhx_
    27 / / 09.10.2006
    Не парьтесь вы все :) Пишите просто как удобно, и так чтобы потом еще можно было бы понять, что вы некоторое время назад написали )
    3.3K
    10 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=aks]Вопрос же был про getch() в С++. А в С++ многие функции из библиотеки С переопределенны.[/QUOTE]
    Хорошо, тогда ставим вопрос ребром: Hydra, какой у вас компилятор? Дело вот в чём. Если это чистый С++ (не знаю, бывают ли такие), то тогда понятно, почему в стандартных функциях используются классы. Но большинство компиляторов позволяют писать модули как на С, так и на С++. И в С++ Builder'е, например, stdin задекларирован тоже в стиле С (наподобие тому примеру, который я привёл - из заголовочных файлов LCC - компилятора чистого С). То же самое в стареньком Turbo C++ для DOS. Поэтому-то мне и странно, откуда в вашем примере взялись классы.
    547
    11 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Цитата:

    ... Hydra, какой у вас компилятор? Дело вот в чём. Если это чистый С++ (не знаю, бывают ли такие), то тогда понятно, почему в стандартных функциях используются классы. Но большинство компиляторов позволяют писать модули как на С, так и на С++. И в С++ Builder'е, например, stdin задекларирован тоже в стиле С...


    У меня С++Builder6: смотрим строку 124 файла stdio.h ... ;)
    Кстати, а вот VC++7 stdin определен через struct, по Сишному.

    240
    11 октября 2006 года
    aks
    2.5K / / 14.07.2006
    [QUOTE=ShadyMan]Если это чистый С++ (не знаю, бывают ли такие), то тогда понятно, почему в стандартных функциях используются классы. Но большинство компиляторов позволяют писать модули как на С, так и на С++. [/QUOTE]
    Ну как бы C - это всеравно подмножество языка C++ =)
    3.3K
    11 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Hydra]У меня С++Builder6: смотрим строку 124 файла stdio.h ... ;)[/QUOTE]
    Ирония здесь неуместна: у тебя шестой, а у меня пятый. :) Так что, выходит, написать проект на чистом С в Бильдере 6 нельзя?
    [QUOTE=aks]Ну как бы C - это всеравно подмножество языка C++[/QUOTE]
    Оно-то, может, и подмножество, да только есть чёткое разделение: этот модуль написан на С, а этот на С++. Если функция описана в заголовочном файле таким образом, что она использует классы, то использовать её в проекте на С будет невозможно.
    1.9K
    11 октября 2006 года
    [*]Frosty
    278 / / 17.06.2006
    [QUOTE=aks]Ну как бы C - это всеравно подмножество языка C++ =)[/QUOTE]
    Чистый С - подмножество С++, а есть еще Классический, С89, С99, которые не являються подмножествами С++.
    2 ShadyMan
    О Чистом С++ не слышал. Для чего чистый? Есть чистый С, т.е. С совместимый с С++.
    Example:
    C89-99:
     
    Код:
    int* p = malloc(1);
    int* p = (int*)malloc(...);

    Standart C++:
    только
     
    Код:
    int* p = (int*)malloc(...);

    чистый С(совместим и с С и с С++):
    только
     
    Код:
    int* p = (int*)malloc(...);
    547
    12 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Цитата:

    Так что, выходит, написать проект на чистом С в Бильдере 6 нельзя?


    Можно. При создании консольного приложения отключить MultiThread и указать, что будет C, а не C++ - т.е. то же что и в пятом. В свойствах проекта даже можно выбрать диалект (Unix, Ansi и какой-то K&R).
    Имхо надо пытаться либы в своих проектах писать так, чтобы компилировались на VC++ и в билдере, такой партируемости обычно достаточно - все равно большинство заказчиков под виндой.

    3.3K
    12 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    Хорошо, что можно. Только всё равно не понятно, как это происходит, если функции должен передаваться класс, а у нас С - и никаких классов. Как-то уж очень это хитро, видно, сделано в вашем Бильдере.
    547
    13 октября 2006 года
    Hydra
    488 / / 20.06.2006
    Все просто как все гениальное - т.к. C подмножество C++, то билдер обработает любой C код.
     
    Код:
    #include <stdio.h>
    void main()
    { puts("Hello world"); }

    компилирует за милую душу :)
    А вот если возникла необходимость работать с классами - тогда речь уже не о C...
    3.3K
    13 октября 2006 года
    ShadyMan
    191 / / 15.07.2006
    [QUOTE=Hydra]А вот если возникла необходимость работать с классами - тогда речь уже не о C...[/QUOTE]
    Вот чёрт! Так я о чём тебе и говорю! Как это так одна из базовых функций С (а не С++) - getc в твоём Бильдере имеет своим параметром класс?
    240
    15 октября 2006 года
    aks
    2.5K / / 14.07.2006
    Блииин. Что мешает С++ иметь свою реализацию функций из C?
    Не удивляет же что Сишные функции скажем isupper, islower, isdigit и т.п., которые изначально принимали только символ в С++ принимают еще и локаль и находятся в нэймспейсе std =)
    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог