Все ф-ии, которые я перебрал: fread,getch,getc требуют нажатия Enter по окончанию ввода. А мне нужно, чтобы ф-ия возвращала либо при заполнении переданного в нее буфера, либо по какой нить ошибке.
Спасибо
19.05.09 23:18: Перенесено модератором из 'C/C++' — Кодт
Re: Не могу найти ф-ию считывания со ст. входного потока(Win
От:
Аноним
Дата:
14.05.09 16:05
Оценка:
N>Все ф-ии, которые я перебрал: fread,getch,getc требуют нажатия Enter по окончанию ввода. А мне нужно, чтобы ф-ия возвращала либо при заполнении переданного в нее буфера, либо по какой нить ошибке.
getch,getc не требуют ентера, вы чтото напутали.
Re: Не могу найти ф-ию считывания со ст. входного потока(Win
Здравствуйте, niko715, Вы писали:
N>Все ф-ии, которые я перебрал: fread,getch,getc требуют нажатия Enter по окончанию ввода. А мне нужно, чтобы ф-ия возвращала либо при заполнении переданного в нее буфера, либо по какой нить ошибке.
getch и getche (из <conio.h>) не требуют Enter.
Впрочем, это может зависеть от консоли и от сишного рантайма (в котором эти функции реализованы через вызовы API операционной системы).
Во всяком случае, VC2005 работает как часы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[2]: Не могу найти ф-ию считывания со ст. входного потока(
getch и getche (из <conio.h>) не требуют Enter.
Впрочем, это может зависеть от консоли и от сишного рантайма (в котором эти функции реализованы через вызовы API операционной системы).
Во всяком случае, VC2005 работает как часы.
Да, но они посимвольно считывают,хочецца с буферизацией.
Re[2]: Не могу найти ф-ию считывания со ст. входного потока(
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, <Аноним>, Вы писали:
А>>getch,getc не требуют ентера, вы чтото напутали.
К>getch не требует (читает напрямую с консоли), а getc — требует.
Дело в том, что мне нужно отследить,что поступление данных окончилось или прервалось.Ждать какогото символа — никанает, т.к. входным потоком этой тулзы могет являтся выходной поток какойнить предыдущей.
Напр:командная строка Far: type Предыдущий.txt > Эта_Тулза.exe
буду благодарен за совет
Re[3]: Не могу найти ф-ию считывания со ст. входного потока(
Здравствуйте, niko715, Вы писали:
N>Да, но они посимвольно считывают,хочецца с буферизацией.
Ну извиняйте. Это ты уже шелл эмулировать будешь — чтобы синхронное чтение было не до LF/EOT/EOF, а до определённой длины строки.
Обрати внимание, что обычный буферизованный ввод позволяет так или иначе редактировать текст (как минимум, стирать его бэкспейсом).
То есть, если ты заказал 4 символа, а пользователь ввёл 5, два стёр и один добавил, то получишь окончательный вариант, а не первый его "черновик".
Я так понимаю, мини-шелл для ввода — это забота сишного рантайма.
Поэтому он такой тупой (в виндах) — без памяти, без подстановок, без клипборда...
Можно поискать что-нибудь в сторону curses?
Серьёзные программы с собственным консольным вводом (например, интерпретаторы питона, хаскела, и проч., и проч., не говоря уже о cmd.exe) реализуют его ручками. Причём каждый — кто во что горазд.
Хотя возможно, что этот зоопарк — беда именно виндоуза, а в никсах сишный рантайм уже сделал всё сам и единообразно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[4]: Не могу найти ф-ию считывания со ст. входного потока(
Здравствуйте, niko715, Вы писали:
N>Дело в том, что мне нужно отследить,что поступление данных окончилось или прервалось.Ждать какогото символа — никанает, т.к. входным потоком этой тулзы могет являтся выходной поток какойнить предыдущей. N>Напр:командная строка Far: type Предыдущий.txt > Эта_Тулза.exe
Тут есть 3 принципиально разных режима
— интерактивное чтение с консоли (вольны реализовать как угодно; обычно чтение построчное)
— чтение из потока (таймаутов быть не может, только конец файла; чтение строго посимвольное)
— чтение из pipe (в принципе, могут быть и таймауты)
Сишный рантайм реализует потоковые функции так, что они внутри себя различают — консоль это или нет. _isatty(_fileno(stdin)).
Никто (кроме лени) не мешает тебе вручную сделать собственный шелл с любым необходимым поведением — например, мгновенным вводом или ожиданием нужного количества символов.
Правда, вламываться в сишный рантайм — мучительно и непортабельно. (Можешь ради интереса хакнуть структуру FILE у stdin).
Проще написать собственный наследник std::streambuf и подсунуть его std::istream'у (хоть самому std::cin'у).
После чего все высокоуровневые функции ввода будут проходить через твои ручки, а ты уже с консолью напрямую вытворяй что хочешь.
(Если хочешь вытворять кроссплатформенно, то лучше делать это с помощью ***curses, но можно и прямо на Console API).
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[3]: Не могу найти ф-ию считывания со ст. входного потока(
N>getch и getche (из <conio.h>) не требуют Enter.
N>Впрочем, это может зависеть от консоли и от сишного рантайма (в котором эти функции реализованы через вызовы API операционной системы).
N>Во всяком случае, VC2005 работает как часы.
N>Да, но они посимвольно считывают,хочецца с буферизацией.
ReadConsoleInput
With best regards
Pavel Dvorkin
Re: Не могу найти ф-ию считывания со ст. входного потока(Win
От:
Аноним
Дата:
19.05.09 11:20
Оценка:
Здравствуйте, niko715, Вы писали:
N>Все ф-ии, которые я перебрал: fread,getch,getc требуют нажатия Enter по окончанию ввода. А мне нужно, чтобы ф-ия возвращала либо при заполнении переданного в нее буфера, либо по какой нить ошибке.
N>Спасибо
Здравствуйте, Кодт, Вы писали:
К>Ууу! Ты предлагаешь читать и парсить все консольные события? К>Ну нафиг, лучше уж сосредоточиться только на потоке символов.
Ай-яй-яй! А парсить ненужные мне неклавиатурные события зачем ?
Из MSDN
while (1)
{
// Wait for the events. if (! ReadConsoleInput(
hStdin, // input buffer handle
irInBuf, // buffer to read into
128, // size of read buffer
&cNumRead) ) // number of records read
MyErrorExit(TEXT("ReadConsoleInput"));
// Dispatch the events to the appropriate handler. for (i = 0; i < cNumRead; i++)
{
switch(irInBuf[i].EventType)
{
case KEY_EVENT: // keyboard input
KeyEventProc(irInBuf[i].Event.KeyEvent);
break;
// а остальные в печку - Dvorkin Pavel
Очень сложно ? Зато можно отловить нажатие любой клавиши.
Ну а если не нравится — на тебе вот это
int _kbhit( void );
Return Value
_kbhit returns a nonzero value if a key has been pressed. Otherwise, it returns 0.
Remarks
The _kbhit function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then