fgets
отлично работает со встроенными нулевыми байтами. Предварительно заполните ваш буфер \n
(используя memset
), а затем используйте memchr(buf, '\n', sizeof buf)
. Если memchr
возвращает NULL
, ваш буфер был слишком мал, и вам нужно увеличить его, чтобы прочитать оставшуюся часть строки. В противном случае вы можете определить, является ли найденная вами новая строка концом строки или заполнением, которым вы предварительно заполнили буфер, проверяя следующий байт. Если найденная вами новая строка находится в конце буфера или имеет другую новую строку сразу после нее, это от заполнения, а предыдущий байт - это нулевой терминатор, вставленный fgets
(не нуль из файла). В противном случае найденная вами новая строка имеет нулевой байт после него (терминатор вставляется fgets
, и это перевод строки в конце строки.
Другие подходы будут медленными (повторяется fgetc
) или тратят ресурсы (и рискуют иссякнуть) (загрузка всего файла в память).