Аналог getch() в С++
так же глянь http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.17
Твоё великодушие, squirL, меня поражает
мусор за пределы гостевой книги не выношу. и тебе не советую.
Уточняю вопрос: речь не идёт о Linux и проч. Я хотел узнать только на счёт консольных приложений Windows и DOS.
[/quote]
:D
а ты не заметил, что все С++ ники жуткие приверженцы стандартов? ;)
нету такой фичи. так что оставайся с getch(). либо копай MSDN на предмет соответствующих Win32 API - только это уже не будет С++.
Да нет, мне-то как раз нравится. Просто на форуме так часто слышатся упреки в адрес начинающих и не очень от аксакалов программирования по поводу смешения стилей С и С++, что хотелось прояснить этот вопрос. Вдруг там есть какие-нибудь специфические финты вокруг cout, позволяющие не использовать getch. А вообще это разделение на стиль С и С++ мне не совсем ясно. Например, чем принципиально отличается использование оператора new от вызова функции malloc? Тем более, что в конечном итоге выделение памяти всё равно должно производиться именно операционной системой и непосредственно средствами языка или среды программирования эта задача не может быть решена.
+ в new используються исключения;
+ new это оператор, с вытекающими плюсами;
+ в манах пишут new лучше, чем malloc);:)
Имеется в виду try - catch?
[QUOTE='
Так какими же всё-таки плюсами?
Ты правильно понял.
А плюсы от оператора, ну например - возможность перегрузки для отдельного типа.
malloc этого естественно не делает.
malloc этого естественно не делает.[/QUOTE]
А вот это уже интересно. Спасибо, наконец-то весомый аргумент.
getchar is a macro that returns the next character on the named input stream stdin. It is defined to be getc(stdin).
Так что, похоже, C++
[QUOTE=Hydra]Так что, похоже, C++[/QUOTE]Что вы этим хотели сказать, если не секрет?
судя по всему с точки зрения аксакалов и написателей стандартов С++ - чтение символов без Enter - не в стиле С++. гыг-гыг.
Вовсе нет, просто исторически так сложилось что режимом ввода символов управлял железный терминал для которого основной режим ввода именно построчный...
Извините, но это чушь собачья. getc, как и getch - функции стандартной библиотеки С. stdin всего лишь стандартный поток для ввода и имеет тип *FILE (FILE - это структура такая, а вовсе не класс).
функция getch не является стандартом С. В Винде она в conio.h, а в Юниксе только в curses.h и то не совсем то же самое
мне как конечному пользователю совершенно начхать что и как там сложилось исторически... мне нужен удобный и простой набор функций явным и простым образом покрывающий все множество возникающих задач... вчера 2 часа провозился с потоковой библиотекой STL потом плюнул и переписал за 20 минут на WinAPI.... конечно я просто устал к утру , но помоему STL - явно криво спроектирована...
Дык, всем это нужно. Найди хорошую библиотеку функций. Я сам такую ищу. Эх "есть женщины в Русских селеньях. Еще бы туда мужиков...". Только давай уж не будем о грустном.
[QUOTE=PitxBull]вчера 2 часа провозился с потоковой библиотекой STL потом плюнул и переписал за 20 минут на WinAPI.... конечно я просто устал к утру , но помоему STL - явно криво спроектирована...[/QUOTE]
Насчет кривости STL скажу по секрету шепотом: (полностью согласен). c iostream я тоже изрядно попарился, оно вроде и удобно для некоторых целей (перегружаемый оператор <<) да глючит: не всегда могу заставить компилятора использовать этот перегруженный оператор...
Разве конкретные функции вообще могут быть стандартом языка? Я говорил не о стандарте языка, а о стандартной библиотеке. Если getc используется и в Windows и в Unix, а getch - всего лишь макрос, основанный на getc, то какая разница, прописана getch в стандартных заголовочных файлах или нет? Другое дело, что работают эти функции в Unix не так, как в Windows.
Извините, но это чушь собачья. getc, как и getch - функции стандартной библиотеки С. stdin всего лишь стандартный поток для ввода и имеет тип *FILE (FILE - это структура такая, а вовсе не класс).
из stdio.h
#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
Конечные функции могут воходить в стандартные библиотеки и определенны стандартом, как обязательные.
А Svyatozar прав, conio.h и getch() - это досовская библиотека и функция никогда не входившая в этот стандарт.
Тю-блин, совсем меня запутали. Это всё Hydra начал про макросы писать, а я и перепутал getch и getchar. Это getchar - макрос getc. Всё правильно, беру свои слова обратно.
[QUOTE=Hydra]из stdio.h
#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
Ну и что вы меня своим stdio.h пугаете? А у меня в нём прописано так:
#define _iob (*_imp___iob)
#define stdin (&_iob[0])
#define stdout (&_iob[1])
#define stderr (&_iob[2])
Если у вас компилятор C++, то в нём хоть всё на свете может определяться через классы, но это же не значит, что до C++ не существовало функций, ориентированных на стандартный ввод и вывод.
Если у вас компилятор C++, то в нём хоть всё на свете может определяться через классы, но это же не значит, что до C++ не существовало функций, ориентированных на стандартный ввод и вывод.
Тогда не совсем понятен исходный вопрос (см. subj). Если его понимать буквально, то есть, ибо getchar() макрос аналогичный getch() реализованный с помощью потоковых классов.
А так, в итоге, все в машинный код превращается, и механизмы работы практичеcки любой программной реализации там выглядят одинаково (коды символов, матод получения символа на уровне архитектуры контупера и т.д.)
Вопрос же был про getch() в С++. А в С++ многие функции из библиотеки С переопределенны.
Хорошо, тогда ставим вопрос ребром: Hydra, какой у вас компилятор? Дело вот в чём. Если это чистый С++ (не знаю, бывают ли такие), то тогда понятно, почему в стандартных функциях используются классы. Но большинство компиляторов позволяют писать модули как на С, так и на С++. И в С++ Builder'е, например, stdin задекларирован тоже в стиле С (наподобие тому примеру, который я привёл - из заголовочных файлов LCC - компилятора чистого С). То же самое в стареньком Turbo C++ для DOS. Поэтому-то мне и странно, откуда в вашем примере взялись классы.
... Hydra, какой у вас компилятор? Дело вот в чём. Если это чистый С++ (не знаю, бывают ли такие), то тогда понятно, почему в стандартных функциях используются классы. Но большинство компиляторов позволяют писать модули как на С, так и на С++. И в С++ Builder'е, например, stdin задекларирован тоже в стиле С...
У меня С++Builder6: смотрим строку 124 файла stdio.h ... ;)
Кстати, а вот VC++7 stdin определен через struct, по Сишному.
Ну как бы C - это всеравно подмножество языка C++ =)
Ирония здесь неуместна: у тебя шестой, а у меня пятый. :) Так что, выходит, написать проект на чистом С в Бильдере 6 нельзя?
[QUOTE=aks]Ну как бы C - это всеравно подмножество языка C++[/QUOTE]
Оно-то, может, и подмножество, да только есть чёткое разделение: этот модуль написан на С, а этот на С++. Если функция описана в заголовочном файле таким образом, что она использует классы, то использовать её в проекте на С будет невозможно.
Чистый С - подмножество С++, а есть еще Классический, С89, С99, которые не являються подмножествами С++.
2 ShadyMan
О Чистом С++ не слышал. Для чего чистый? Есть чистый С, т.е. С совместимый с С++.
Example:
C89-99:
int* p = (int*)malloc(...);
Standart C++:
только
чистый С(совместим и с С и с С++):
только
Так что, выходит, написать проект на чистом С в Бильдере 6 нельзя?
Можно. При создании консольного приложения отключить MultiThread и указать, что будет C, а не C++ - т.е. то же что и в пятом. В свойствах проекта даже можно выбрать диалект (Unix, Ansi и какой-то K&R).
Имхо надо пытаться либы в своих проектах писать так, чтобы компилировались на VC++ и в билдере, такой партируемости обычно достаточно - все равно большинство заказчиков под виндой.
void main()
{ puts("Hello world"); }
компилирует за милую душу :)
А вот если возникла необходимость работать с классами - тогда речь уже не о C...
Вот чёрт! Так я о чём тебе и говорю! Как это так одна из базовых функций С (а не С++) - getc в твоём Бильдере имеет своим параметром класс?
Не удивляет же что Сишные функции скажем isupper, islower, isdigit и т.п., которые изначально принимали только символ в С++ принимают еще и локаль и находятся в нэймспейсе std =)