困惑:指向结构体数组的指针不能做fwrite()/fread()的参数?
各位达人,我写一个练习代码,里面用到指向结构体数组的指针做fwrite()和fread()的参数,结果报错说fwrite()/fread()的第一个参数不匹配。例如:
#include <stdio.h>
#include <stdlib.h>
#define LEN 41
#define MAX 11
#define SIZE 10
typedef struct info {
char fname[LEN];
char lname[LEN];
int age;
char gender[MAX];
char post[LEN];
bool state;
}INFO;
void processdata(INFO *, int, FILE *);
int main(void)
{
INFO data[SIZE]; //这里data[SIZE]已初始化,具体内容就不敲了,请见谅
INFO * pp = &data[0];
int index;
FILE * fp;
if((fp = fopen("info.dat", "wb+")) == NULL)
{
fprintf(stderr, "Error opening file.");
exit(EXIT_FAILURE);
}
for(index = 0; index < SIZE; index++)
fwrite(pp[index], sizeof (INFO),1, fp);
processdata(pp, SIZE, fp);
fclose(fp);
return 0;
}
void processdata(INFO * pt, int n, FILE * fp)
{
int index;
puts("Data written:");
for(index = 0; index < n; index++)
{
fread(pt[index], sizeof(INFO), 1, fp);
if(pt[index]->state == true)
printf("\nFirst name: %s Last name: %s Age: %d Gender: %s Post: %s",
pt[index]->fname, pt[index]->lname, pt[index]->age, pt[index]->gender, pt[index]->post);
}
}
[解决办法]
fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
[解决办法]
不是空指针!
第一个参数 是void型指针!也就是接受任意类型的指针而已!
fwrite( &pp[index], sizeof (INFO),1, fp);
[解决办法]
pp是指针,但是pp[index]不是。这样说吧,你定义了数组data[SIZE],里面每个元素都是一个你定义的INFO结构,指针pp指向这个数组的首地址,因此pp[index]表示数组里的第index个元素,也就是表示的是数组里第index个的INFO结构数据,所以不是指针,加上&后取地址后才是。
[解决办法]
pp[index]是取了里面的内容的不是指针!