Форум программистов CodeGuru
19 Июнь 2018, 02:40:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Размер введеного в stdin  (Прочитано 19701 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CatWarrior
Пользователь
***
Офлайн Офлайн

Сообщений: 44


Просмотр профиля WWW
« : 30 Декабрь 2006, 21:59:55 »

В FreeBSD мне очень нравится возможность конвейерности т.е. результат (cout) 1ой функции посылается во входной (cin) поток 2ой функции. И вот возник вопрос:
как определить есть ли во входном потоки чтонибудь или нет. Ведь если я с него буду читать когда там ничего нет то программа будет ждать пока пользователь не введет чегонить. Если же я буду читать когда там есть данные то все хорошо работает даже feof(stdin) не 0 возвращает (когда все прочитано).
« Последнее редактирование: 30 Декабрь 2006, 22:03:44 от catwarrior » Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 31 Декабрь 2006, 07:07:26 »

Цитировать
Ведь если я с него буду читать когда там ничего нет то программа будет ждать пока пользователь не введет чегонить.

Так чтение с консоли, чтоли происходит ?
Вообще, вот цитата из msdn:

Цитировать
Код:
size_t fread(
  void *buffer,
  size_t size,
  size_t count,
  FILE *stream
);

...
Return Value
fread returns the number of full items actually read, which may be less than count if an error occurs or if the end of the file is encountered before reaching count. Use the feof or ferror function to distinguish a read error from an end-of-file condition. If size or count is 0, fread returns 0 and the buffer contents are unchanged.

То есть, имхо, можно просто читать. Когда будет конец файла - просто прочитается меньше запрошенного. Ну, а если читается пользовательский ввод, то можно отдельный поток для этого выделить (если надо еще что то параллельно делать).
Записан

CatWarrior
Пользователь
***
Офлайн Офлайн

Сообщений: 44


Просмотр профиля WWW
« Ответ #2 : 31 Декабрь 2006, 16:07:10 »

Цитировать
Так чтение с консоли, чтоли происходит ?

Происходит когда в потоке ввода ничего нет. Вот если fread то тоже самое. А если есть то спокойно их от туда берет.

Можно какнить узнать есть ли там чего не читая stdin при этом?
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 05 Январь 2007, 22:20:07 »

Вообще, если чтение происходит с консоли, то можно использовать _kbhit для проверки того, есть ли какой то пользовательский ввод:
Код:
int _kbhit( void );

возвращает не нулевое значение, если была нажата клавиша.
Ну и потом использовать _getch или _getche для чтения символа.

Например, для очистки буфера ввода можно использовать такой код:
Код:
while(_kbhit())
     _getch();
Записан

Aeron
Пользователь
***
Офлайн Офлайн

Сообщений: 49


Просмотр профиля
« Ответ #4 : 11 Январь 2007, 00:37:12 »

Цитировать
Например, для очистки буфера ввода можно использовать такой код:
Код:
while(_kbhit())
     _getch();

Такой код еще в DOS использовался.
Только там kbhit и getch.
Или чтобы ждать нажатия клавиши:
Код:
while(kbhit())
   sleep(10);
Записан
CatWarrior
Пользователь
***
Офлайн Офлайн

Сообщений: 44


Просмотр профиля WWW
« Ответ #5 : 14 Январь 2007, 18:01:22 »

Упс.)) В gcc 3.2.1 в FreeBSD нет библиотеки  conio.h
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #6 : 15 Январь 2007, 21:55:30 »

Дык, как так ?
Должна быть. Может, поставлено не так ? Или сконфигурить надо ?
Я под линукс (ALT 2.4) пишу сейчас на работе. Там gcc 3.3 - все в порядке.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!