困惑:指向结构体数组的指针不能做fwrite()/fread()的参数?

mcmay 2013-12-10 10:01:21
各位达人,我写一个练习代码,里面用到指向结构体数组的指针做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);
}
}

...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
max_min_ 2013-12-11
  • 打赏
  • 举报
回复
引用 4 楼 mcmay 的回复:
[quote=引用 2 楼 max_min_ 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
不是空指针! 第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 
[/quote] 谢谢,max_min_版主,不过我向KenZhang1031请教的3楼的问题我也想同样向你请教。[/quote] pp[index]是取了里面的内容的不是指针!
mcmay 2013-12-11
  • 打赏
  • 举报
回复
引用 6 楼 max_min_ 的回复:
[quote=引用 4 楼 mcmay 的回复:] [quote=引用 2 楼 max_min_ 的回复:] [quote=引用 1 楼 KenZhang1031 的回复:] fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
不是空指针! 第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 
[/quote] 谢谢,max_min_版主,不过我向KenZhang1031请教的3楼的问题我也想同样向你请教。[/quote] pp[index]是取了里面的内容的不是指针![/quote] 是的,后来想想,用普通数组的指针所引用的也的确是数组元素本身而非其指针。谢谢!
mcmay 2013-12-11
  • 打赏
  • 举报
回复
引用 5 楼 KenZhang1031 的回复:
引用
谢谢,我试了,还真行!但是 INFO * pp不是已经就等于&data[0]了吗?它本来就是指针的啊,怎么还要再用&pp[index]呢?而且函数processdata(INFO * pp, int n, FILE *fp)里面的参数INFO *pp也明显就是指针啊,怎么也还要采取&pt[index]的形式,fread()才认呢?请指教!
pp是指针,但是pp[index]不是。这样说吧,你定义了数组data[SIZE],里面每个元素都是一个你定义的INFO结构,指针pp指向这个数组的首地址,因此pp[index]表示数组里的第index个元素,也就是表示的是数组里第index个的INFO结构数据,所以不是指针,加上&后取地址后才是。
确实如此,后来想通了,谢谢!
Mr. Code 2013-12-10
  • 打赏
  • 举报
回复
引用
谢谢,我试了,还真行!但是 INFO * pp不是已经就等于&data[0]了吗?它本来就是指针的啊,怎么还要再用&pp[index]呢?而且函数processdata(INFO * pp, int n, FILE *fp)里面的参数INFO *pp也明显就是指针啊,怎么也还要采取&pt[index]的形式,fread()才认呢?请指教!
pp是指针,但是pp[index]不是。这样说吧,你定义了数组data[SIZE],里面每个元素都是一个你定义的INFO结构,指针pp指向这个数组的首地址,因此pp[index]表示数组里的第index个元素,也就是表示的是数组里第index个的INFO结构数据,所以不是指针,加上&后取地址后才是。
mcmay 2013-12-10
  • 打赏
  • 举报
回复
引用 2 楼 max_min_ 的回复:
[quote=引用 1 楼 KenZhang1031 的回复:] fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
不是空指针! 第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 
[/quote] 谢谢,max_min_版主,不过我向KenZhang1031请教的3楼的问题我也想同样向你请教。
mcmay 2013-12-10
  • 打赏
  • 举报
回复
引用 1 楼 KenZhang1031 的回复:
fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
谢谢,我试了,还真行!但是 INFO * pp不是已经就等于&data[0]了吗?它本来就是指针的啊,怎么还要再用&pp[index]呢?而且函数processdata(INFO * pp, int n, FILE *fp)里面的参数INFO *pp也明显就是指针啊,怎么也还要采取&pt[index]的形式,fread()才认呢?请指教!
max_min_ 2013-12-10
  • 打赏
  • 举报
回复
引用 1 楼 KenZhang1031 的回复:
fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。
不是空指针! 第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 
Mr. Code 2013-12-10
  • 打赏
  • 举报
回复
fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧