2015-11-01 3 views
0

Как проверить, не пуст ли стандартный ввод в C? У меня есть проект для школы, и нам разрешено использовать malloc, писать, читать и бесплатно, но единственные решения, которые я нахожу в функциях веб-использования, мне не разрешают использовать. Мое чтение отлично работает, за исключением случаев, когда вы ничего не помещаете во входные данные.C return null, если чтение 0 пусто

Вот мой код:

char *ft_get_buffer(void) 
{ 
    char buf[10]; 
    int    ret; 
    int    count; 
    char *result; 

    count = 0; 
    result = ""; 
    while (1) 
    { 
      ret = read(0, buf, 10); 
      count += ret; 
      if (ret < 10) 
      { 
        buf[ret] = '\0'; 
        result = ft_ralloc(buf, result, count); 
        break ; 
      } 
      else 
        result = ft_ralloc(buf, result, count); 
    } 
    return (result); 
} 

эхо "тест" | ./mybinary // работает отлично
эхо ./mybinary // бесконечный цикл

+0

Эта программа скоро закончилась на [Wandbox] (http://melpon.org/wandbox/permlink/0VH7sPB6aFUkoqiO) с отключением 'ft_ralloc'. Попробуйте отладить, напечатав 'ret', или проблема может быть в' ft_ralloc'. – MikeCAT

+3

read() возвращает -1, если есть ошибка ввода-вывода. Думать об этом. Что делает ваш код в этом случае? – Gene

+0

Пробовал ли вы «echo» test »| ./mybinary' с 'test' размером' 0'? – alk

ответ

0

read() будет блокировать, если встречая EOF или событие сигнала не происходит.

Так что код не будет «сидеть» на read(), пока одна из 4 вещей происходят:

  1. запрашиваемое количество char с входными — возвращается запросить char счет
  2. EOF встречаются — возвращает число char s считывание, которое может быть 0
  3. a сигнал происходит — завершение пути выхода
  4. ошибка ввода/вывода происходит — возвращается -1

Для проверки любого возврата состояния немедленно проверить значение ret перед использованием этого значения для любых целей.

Проверка на:

  1. ret == запрошенное количество char сек — затем петлю, чтобы читать далее
  2. 0 <= ret < требуемое число char сек — EOF встреченных, обрабатывать соответствующим образом
  3. 0 > ret — произошла ошибка, ручка ошибки
+0

Спасибо за это удивительное объяснение. – mrdotb

Смежные вопросы