Не могу найти ф-ию считывания со ст. входного потока(WinAPI)
От: niko715  
Дата: 14.05.09 15:47
Оценка:
Все ф-ии, которые я перебрал: 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
От: Кодт Россия  
Дата: 14.05.09 16:19
Оценка:
Здравствуйте, niko715, Вы писали:

N>Все ф-ии, которые я перебрал: fread,getch,getc требуют нажатия Enter по окончанию ввода. А мне нужно, чтобы ф-ия возвращала либо при заполнении переданного в нее буфера, либо по какой нить ошибке.


getch и getche (из <conio.h>) не требуют Enter.
Впрочем, это может зависеть от консоли и от сишного рантайма (в котором эти функции реализованы через вызовы API операционной системы).
Во всяком случае, VC2005 работает как часы.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[2]: Не могу найти ф-ию считывания со ст. входного потока(
От: niko715  
Дата: 14.05.09 16:36
Оценка:

getch и getche (из <conio.h>) не требуют Enter.
Впрочем, это может зависеть от консоли и от сишного рантайма (в котором эти функции реализованы через вызовы API операционной системы).
Во всяком случае, VC2005 работает как часы.


Да, но они посимвольно считывают,хочецца с буферизацией.
Re[2]: Не могу найти ф-ию считывания со ст. входного потока(
От: Кодт Россия  
Дата: 14.05.09 17:06
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>getch,getc не требуют ентера, вы чтото напутали.


getch не требует (читает напрямую с консоли), а getc — требует.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[3]: Не могу найти ф-ию считывания со ст. входного потока(
От: niko715  
Дата: 14.05.09 17:13
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, <Аноним>, Вы писали:


А>>getch,getc не требуют ентера, вы чтото напутали.


К>getch не требует (читает напрямую с консоли), а getc — требует.


Дело в том, что мне нужно отследить,что поступление данных окончилось или прервалось.Ждать какогото символа — никанает, т.к. входным потоком этой тулзы могет являтся выходной поток какойнить предыдущей.
Напр:командная строка Far: type Предыдущий.txt > Эта_Тулза.exe

буду благодарен за совет
Re[3]: Не могу найти ф-ию считывания со ст. входного потока(
От: Кодт Россия  
Дата: 14.05.09 17:29
Оценка:
Здравствуйте, niko715, Вы писали:

N>Да, но они посимвольно считывают,хочецца с буферизацией.


Ну извиняйте. Это ты уже шелл эмулировать будешь — чтобы синхронное чтение было не до LF/EOT/EOF, а до определённой длины строки.
Обрати внимание, что обычный буферизованный ввод позволяет так или иначе редактировать текст (как минимум, стирать его бэкспейсом).
То есть, если ты заказал 4 символа, а пользователь ввёл 5, два стёр и один добавил, то получишь окончательный вариант, а не первый его "черновик".

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

Серьёзные программы с собственным консольным вводом (например, интерпретаторы питона, хаскела, и проч., и проч., не говоря уже о cmd.exe) реализуют его ручками. Причём каждый — кто во что горазд.
Хотя возможно, что этот зоопарк — беда именно виндоуза, а в никсах сишный рантайм уже сделал всё сам и единообразно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1207>>
Перекуём баги на фичи!
Re[4]: Не могу найти ф-ию считывания со ст. входного потока(
От: Кодт Россия  
Дата: 14.05.09 17:45
Оценка:
Здравствуйте, 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]: Не могу найти ф-ию считывания со ст. входного потока(
От: Pavel Dvorkin Россия  
Дата: 18.05.09 02:43
Оценка: 3 (1) -1
Здравствуйте, niko715, Вы писали:

N>

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>Спасибо


Try kbhit(): http://www.cprogramming.com/fod/kbhit.html
Re[4]: Не могу найти ф-ию считывания со ст. входного потока(
От: Кодт Россия  
Дата: 19.05.09 19:17
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

N>>Да, но они посимвольно считывают,хочецца с буферизацией.


PD>ReadConsoleInput


Ууу! Ты предлагаешь читать и парсить все консольные события?
Ну нафиг, лучше уж сосредоточиться только на потоке символов.
Перекуём баги на фичи!
Re[5]: Не могу найти ф-ию считывания со ст. входного потока(
От: Pavel Dvorkin Россия  
Дата: 20.05.09 07:49
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Ууу! Ты предлагаешь читать и парсить все консольные события?

К>Ну нафиг, лучше уж сосредоточиться только на потоке символов.

Ай-яй-яй! А парсить ненужные мне неклавиатурные события зачем ?

Из 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
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.