Что означает "fgets не остановится, если обнаружит NUL" - PullRequest
0 голосов
/ 06 мая 2020

Итак, я нашел ответ ниже на StackOverflow

fgets на самом деле не устарел в C99 или текущем стандарте C11. Но автор этого учебника прав в том, что fgets не останавливается, когда встречает NUL, и не имеет механизма для сообщения о чтении такого символа.

Функция fgets читает как минимум на единицу меньше, чем количество символов указанный n из потока, на который указывает stream, в массив, на который указывает s. Никакие дополнительные символы не читаются после символа новой строки (который сохраняется) или после конца файла.

Что означает выражение «fgets не остановится, если встретит NUL? Пожалуйста, объясните с помощью простого фрагмента кода.

Ссылка: Почему функция fgets устарела?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Fgets предназначен только для использования с текстовыми файлами. Почему в текстовом файле может быть null? Так что для большинства случаев это нормально. В худшем случае вы не увидите содержимое после нулевого символа или присоедините к нему следующую строку, потому что считаете, что это неполная строка.

Если вы хотите обнаружить, что ваш буфер fget () ed содержит нули, предварительно заполните его, скажем, chr 1, а затем посмотрите после нуля, чтобы увидеть, не был ли перезаписан chr1. Или используйте ftell, чтобы увидеть, было ли прочитано больше содержимого, чем указано в вашем буфере. Помните, что на windows этот счетчик может быть сброшен на 1 из-за перевода окончания строки, но если вы думаете, что текст не содержит / не содержит конец строки до нуля, то это не проблема, на самом деле.

0 голосов
/ 06 мая 2020

По соглашению, строки в C завершаются NUL. Это означает, что конец строки определяется наличием символа «NUL». Символ NUL - это символ '\0' или, более конкретно, char со значением 0. Все строковые литералы C заканчиваются NUL, и большинство C API, которые принимают строки (как в стандартной библиотеке, так и в большинство других библиотек, написанных на C), ожидают, что эти строки будут завершены NUL.

Это также означает, что символ NUL не может использоваться в качестве нормального значения данных в API, которые ожидают завершения NUL . Эти API-интерфейсы будут рассматривать символ NUL не как значимую часть данных строки, а как конец строки. Например, strlen("foo\0bar") равно 3, а не 7.

fgets считывает символьные данные из файлового потока. Но этот файл может содержать символы NUL. В этом сообщении говорится, что fgets будет обрабатывать символы NUL в файле точно так же, как любой другой символ. fgets завершает указанную строку NUL, но если файл содержит символы NUL, fgets послушно их прочитает.

Это то, о чем предупреждает сообщение: fgets не обрабатывает NUL-символы отличаются от любых других символов, в отличие от большинства других функций C API. Поэтому, если вы передадите строку, сгенерированную fgets, некоторому API, который ожидает завершения NUL, у вас может возникнуть проблема, если этот файл содержит символы NUL.

...