Может ли fgets прочитать пустую строку? - PullRequest
2 голосов
/ 13 октября 2010

При условии, что ФАЙЛ * действителен, рассмотрим:

char buf[128];

if(fgets(buf,sizeof buf,myFile) != NULL) {
   strlen(buf) == 0; //can this ever be true ? In what cases ?
}

Ответы [ 2 ]

4 голосов
/ 14 октября 2010

Да.Помимо передачи 1 (как отметил Игнасио), fgets не выполняет никакой специальной обработки для встроенных нулей.Поэтому, если следующий символ в FILE * равен NUL, strlen будет равен 0. Это одна из причин, почему я предпочитаю функцию POSIX getline .Возвращает количество прочитанных символов, поэтому встроенные нули не являются проблемой.

4 голосов
/ 13 октября 2010

со страницы руководства fgets(3):

ОПИСАНИЕ

  fgets() reads in at most one less than size characters from stream  and
  stores  them  into  the buffer pointed to by s.  Reading stops after an
  EOF or a newline.  If a newline is read, it is stored into the  buffer.
  A '\0' is stored after the last character in the buffer.

...

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

...

  gets() and fgets() return s on success, and NULL on error or  when end
  of file occurs while no characters have been read.

Исходя из этого, можно сделать вывод, что size из 1 заставит его прочитать пустую строку.Эксперименты здесь подтверждают, что.

Между прочим, size из 0, кажется, вообще не изменяет буфер, даже не вставляя \0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...