Почему ошибка сегментации в feof()?

У меня есть следующее перечисление и структура:

enum Destination { unknown = 0, hosok, parlament, var };

struct Client
{
  char name[30];
  char email[30];
  char phone_num[11];
  int client_num;
  enum Destination destination;
  struct tm registration_date;
};

Когда я вызываю следующий метод, он читает первую структуру и печатает ее имя, затем я получаю ошибку сегментации.

void list_clientss()
{
  FILE *f = fopen(filename, "r");
  if( f == NULL )
  {
    perror("Error");
  }
  struct Client client;
  while( !feof( f ) )
  {
    fread(&client, sizeof(struct Client), sizeof(struct Client), f);
    printf("Name: %s\n", client.name);
  }
  fclose(f);
}

Что я не прав?

1 ответ

Решение

Во-первых, ваши фред-звонки должны быть следующими:

fread(&client, sizeof(struct Client), 1, f);

Во-вторых, вместо использования feof, вы можете использовать возвращаемое значение fread, fread возвращает количество прочитанных элементов, которые вы ему передали. Вы можете проверить, отличается ли это число от единицы. Например,

while (fread(&client, sizeof(struct Client), 1, f) == 1) {
    printf("Name: %s\n", client.name);
}

Редактировать 1: Обновить цикл while до более идиоматичной и элегантной версии, как предложил Weather Vane.

Другие вопросы по тегам