Не забывайте, что fgets
оставляет новую строку в буфере.
Кажется, вы читаете файл, созданный в Windows (где символ новой строки - два символа "\r\n"
) в системе, где символ новой строки - только "\n"
. Эти два символа также являются частью строки и будут учитываться как strlen
.
Причина, по которой я предполагаю, что вы читаете созданный Windows файл в системе, отличной от Windows, заключается в том, что для файлов, открытых в текстовом режиме (по умолчанию), функции чтения и записи строк будут переводить переводы строк в зависимости от формата операционной системы.
Например, в Windows, при написании простого "\n"
оно будет переведено и фактически будет записано как "\r\n"
. При чтении происходит обратный перевод ("\r\n"
становится "\n"
).
В системе с простыми "\n"
окончаниями строк (например, Linux или macOS) перевод не требуется, и часть "\r"
будет обрабатываться как любой другой символ.