by fk0 » 18 Jan 2013, 16:20
Дезсофт, ты не прав. В буханках профессионального уровня всё сложней, чем в этих ваших любительских виндах. gets() вообще рискует сразу получить строку, причём с учётом всех редактирований пользователя (трололо!) Фишка в том, что драйвер компорта (ну заодно и клавиатуры с консолью -- типичнейший же компорт) умеет работать в cooked режиме, когда сам всё делает, и на запрос read() отдаёт уже строки. При этом, при вводе юзер может редактировать. Круто? На самом деле нифига не круто, потому, что большинство программ где это действительно нужно вызывают какой-нибудь libreadline, а тот в свою очередь read(). А fread, gets, getchar и т.п. для клавиатурного ввода никто в трезвом уме не юзает (стандартная C библиотека и неблокирующее чтение -- несовместимые понятия). Хотя если блокировка некритична, то getchar таки можно. Но вторая засада. Будет EOF. Если ввод таки неблокирующий. И нужно делать fseek на конец потока для повторения (по крайней мере такие грабли в newlib). Короче на ввод библиотека C вообще ни к месту, read() сам читает, причём и с таймаутом умеет (для компортов и консолей) и редактировать (ну правда там примитивно, не libreadline) умеет.
* Origin: зип файл! (2:5030/1559)