Функция fread не заканчивает строку на \ 0 - PullRequest
8 голосов
/ 15 января 2012

плохо знаком с файлами в C, пытается прочитать файл через fread

Вот содержимое файла:

line1 how

Используемый код:

char c[6];
fread(c,1,5,f1)

При выводе var 'c' содержимое отображается со случайным символом в конце (например, line1 *)

Разве fread не завершает строку или я что-то упустил?

Ответы [ 3 ]

11 голосов
/ 15 января 2012

Нет.Функция fread просто читает несколько элементов, она не имеет понятия «строки».

  • Вы можете добавить терминатор NUL самостоятельно
  • Вы можете использовать fgets /fscanf вместо

Лично я бы пошел с fgets.

2 голосов
/ 15 января 2012

Справочная страница для fread ничего не говорит о добавлении конечного нуля в конец файла.

Если вы хотите быть в безопасности, инициализируйте все байты в вашем массиве c равными нулю (через bzero или что-то в этом роде), и когда вы будете читать, у вас будет завершающий ноль.

Я связал две справочные страницы для fread и bzero, и я надеюсь, что это поможет вам.

1 голос
/ 07 июня 2016

Извините, я немного опоздал на вечеринку.

Нет, fread не справится с этим. Это должно быть сделано вручную. К счастью, это не сложно. Мне нравится использовать возврат fread () для установки NUL так:

char buffer[16+1]; /*leaving room for '\0' */
x = fread(buffer, sizeof(char), 16, stream);
buffer[x]='\0';

и теперь у вас есть завершенная строка \ 0, и в качестве бонуса у нас есть отличная переменная x, которая фактически избавляет нас от необходимости запускать strlen (), если она нам понадобится позже. аккуратный!

...