为什么feof()中的分段错误?

时间:2017-10-28 16:11:54

标签: c segmentation-fault 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 个答案:

答案 0 :(得分:2)

首先,你的fread调用应该如下:

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

其次,您可以使用feof的返回值,而不是使用freadfread返回您传递给它的要读取的元素数。您可以检查此号码是否与1不同。例如,

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

编辑1:将[while>循环更新为更加惯用且优雅的版本,建议风向标