Почему функция fgets устарела?
С учебник по программированию GNU C:
на
fgets
("file get string") функция аналогична функции gets функция. Эта функция устаревший -- это означает, что он устарел и настоятельно рекомендуется не использовать его, потому что это опасный. Это опасно, потому что если входные данные содержат значение null характер, ты не можешь сказать. Не используйтеfgets
Если вы не знаете данных не может содержать значение null. Не используйте его чтение файлов, отредактированных пользователем потому что, если пользователь вводит символ null, вы должны либо обработайте его правильно или распечатайте четкое сообщение об ошибке. Всегда использоватьgetline
илиgetdelim
вместоfgets
Если вы можете.
я думал fgets
функция останавливается, когда она встречает или
n
; почему эта страница руководства предполагает, что нулевой байт "опасен", когда fgets
должен правильно обрабатывать вход? Кроме того, в чем разница между getline
и fgets
и поистине устаревший на C99 или будущие стандарты C?
2 ответов
нет, fgets
фактически не устарел в C99 или текущем стандарте, C11. Но автор этого учебника прав, что fgets
не остановится, когда встретит нуль, и не имеет механизма для сообщения о его чтении такого символа.
на
fgets
функция считывает не более одного меньше, чем количество символов, указанныхn
от ручья, на который указалstream
в массив, на который указываетs
. Никакие дополнительные символы не читаются после символ новой строки (который сохраняется) или после окончания файла.
(§7.21.7.2)
GNU-это getdelim
и getline
были стандартизированы в POSIX 2008, так что если вы нацелены на платформу POSIX, то это может быть не плохая идея использовать их вместо этого.
редактировать я думал, что нет абсолютно безопасного способа использовать fgets
перед лицом символов NUL, но R.. (см. комментарии) указано там есть:
char buf[256];
memset(buf, '\n', sizeof(buf)); // fgets will never write a newline
fgets(buf, sizeof(buf), fp);
Теперь ищите последний не -\n
персонаж buf
. Хотя я бы не рекомендовал этого клуджа.
Это просто пропаганда GNU. Ни в каком официальном смысле это fgets
устаревшие. gets
однако опасно и устарело.