Почему ошибка сегментации в 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.