fgets записывает нулевой терминатор в предоставленный вами буфер (если вы указали размер буфера больше 0). В противном случае вы не могли бы вызвать strlen () для него, strlen () ожидает строку, и если она не завершена как nul, это не строка.
Вы спрашиваете о
line[ strlen( line ) - 1 ] = '\0';
Это удаляет последний символ в line
. Если вы прочитали строку, он заменяет последний символ, предположительно \ n, на нулевой терминатор.
Учтите, что fgets просто читает строку, например, Ваш line
буфер теперь содержит строку «Hello \ n» (здесь \ n это просто escape-последовательность, на самом деле это всего 1 символ, а не 2)
strlen ("Hello \ n") - 6, а 6-1 - 5, поэтому индекс 5. заменяется на 0
"Hello\n"
^
|
Add 0 terminator
Результат:
"Привет"
Только будьте осторожны:
- вы не хотите делать строку [strlen (line) - 1] = '\ 0'; в пустой строке, в этом случае вы закончите делать строку [-1].
- Вы должны проверить, удалось ли fgets. Вы не хотите копаться в
line
, если fgets потерпела неудачу и ничего не записала в ваш буфер.
- Возможно, вы захотите проверить, действительно ли прочитана вся строка. Если строка, которую вы читаете, больше, чем
kMaxLineLength или, например, если последняя "строка" в файле не имеет завершающего \ n, strlen (строка) -1 не будет \ n (новая строка).