我正在读取文件“animals.dat”中的输入数据,可在此处找到https://drive.google.com/open?id=18olXBhRgpGyY0bhpjDSwla2XcBnWoFGM
我对此的指示是: 如果用户输入3,则假设输入文件animals.dat包含动物类型的记录(已定义 您需要询问用户哪个动物记录可以找到并显示在屏幕上 - 以整数表示 表示记录号。动物类型结构定义为:
#pragma pack(1)
struct animal {
short int id;
char name[20];
char species[35];
char size;
short int age;
};
由于结构内存布局在不同的机器上不同,因此pragma pack指令强制编译器 无论平台如何,以相同的方式存储动物类型的变量(使用相同的对齐/填充)。 请注意,这种类型的搜索是使用随机文件访问,并且记录号和动物的id是 同一实体。例如,如果文件包含以下条目:
1,Allegra,Pseudois nayaur,S,5
2,未知,Ailurus fulgens,X,10
3,Athena,Moschus fuscus,X,2
然后是第3个 该文件上的记录是3,Athena,Moschus fuscus,X,2
所有动物按其身份编号按递增顺序列出,从值1开始。如果身份证号码中有漏洞, 例如2,然后结构信息仍然存在于文件中,除了name组件包含字符串 “未知”表示空记录。确保您的搜索使用随机文件处理。 如果输入了无效的id,在本例中为1或3以外的任何值,则程序将显示错误消息。 否则,显示动物记录。在任何一种情况下,程序都将返回初始菜单。
现在,前两个选项工作正常。对于选项3,我一直在使用此代码:
#pragma pack(1)
struct animal {
short int id;
char name[20];
char species[35];
char size;
short int age;
};
typedef struct animal* Animal;
void choice3(FILE *infile) {
Animal tempAnimal;
int id;
printf("Enter ID ");
scanf(" %d", &id);
//fseek(infile,id * sizeof(struct animal),SEEK_SET);
while(fread(&tempAnimal,sizeof(struct animal) - 1,1,infile) == 1) {
printf("%d -- %s\n",tempAnimal->id,tempAnimal->name);
}
}
现在,出于某种原因,我无法将任何内容存储到我的变量tempAnimal中,并且它会抛出一个分段错误:11
答案 0 :(得分:2)
也许您的问题正在发生,因为Animal
是指向while
类型的指针。在&
语句中,您已将tempAnimal
置于Animal
之前,以获取其内存地址。因此,您将一个双指针传递给fread()
作为fread()
ngModel
将一个指针作为其第一个参数:
https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm