提问人:prophet4955 提问时间:10/29/2017 最后编辑:Geneprophet4955 更新时间:10/29/2017 访问量:1118
为什么 feof() 中会出现分割错误?
Why a segmentation fault in 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);
}
我做错了什么?
答:
2赞
eozd
10/29/2017
#1
首先,您的 fread 调用应如下所示:
fread(&client, sizeof(struct Client), 1, f);
其次,您可以使用 的返回值,而不是使用 。 返回已传递给它的要读取的元素数。您可以检查此数字是否与 1 不同。例如feof
fread
fread
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
评论
feof
fread
fread(&client, sizeof(struct Client), 1, f);
struct Client
fread(&client, sizeof(struct Client), 1, f);
!feof(fp)) {}
。