首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-12-11 
困惑:指向结构体数组的指针不能做fwrite()/fread()的参数?各位达人,我写一个练习代码,里面用到指向结构体

困惑:指向结构体数组的指针不能做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]试试。
[解决办法]
引用:
fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。


不是空指针!
第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 

[解决办法]
引用
谢谢,我试了,还真行!但是 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结构数据,所以不是指针,加上&后取地址后才是。
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

fread和fwrite的函数原型第一个参数都是空指针,所以任何指针类型都可以当第一个参数,你的pp[index]和pt[index]都不是指针,而是INFO的结构,改成&pp[index]和&pt[index]试试。


不是空指针!
第一个参数 是void型指针!也就是接受任意类型的指针而已!

fwrite( &pp[index], sizeof (INFO),1, fp); 

谢谢,max_min_版主,不过我向KenZhang1031请教的3楼的问题我也想同样向你请教。

pp[index]是取了里面的内容的不是指针!

热点排行
Bad Request.