为什么 feof() 中会出现分割错误?

Why a segmentation fault in feof()?

提问人:prophet4955 提问时间:10/29/2017 最后编辑:Geneprophet4955 更新时间:10/29/2017 访问量:1118

问:

我有以下枚举和结构:

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);
}

我做错了什么?

C 分段-故障 feof

评论

4赞 Bo Persson 10/29/2017
为什么“while ( !feof (file) )”总是错的可能重复?
2赞 Cornstalks 10/29/2017
你确定它是段错误吗?你的电话是错误的,你正在破坏你的堆栈。你应该打电话feoffreadfread(&client, sizeof(struct Client), 1, f);
0赞 Gene 10/29/2017
您已准备好 1 条类型为 的记录。说struct Clientfread(&client, sizeof(struct Client), 1, f);
1赞 Martin James 10/29/2017
@MartinMagyar 为什么“while ( !feof (file) )”总是错的?
1赞 ad absurdum 10/29/2017
@MartinMagyar -- 最后一条记录被打印了两次,因为你不应该使用 while (!feof(fp)) {}

答:

2赞 eozd 10/29/2017 #1

首先,您的 fread 调用应如下所示:

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

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

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

编辑1:按照 Weather Vane 的建议,将 while 循环更新为更惯用和优雅的版本。

评论

0赞 Weather Vane 10/29/2017
更惯用的可能是while (fread(&client, sizeof(struct Client), 1, f) == 1) { printf("Name: %s\n", client.name); }
0赞 prophet4955 10/29/2017
谢谢!我曾经使用过,因为我们在大学里学过它,但现在我明白了为什么它很糟糕。feof