消息关闭
    暂无新消息!

想写可以向文件里存储和读取结构体数组的函数,如下:

#include <stdio.h>
#include <stdlib.h>

struct list
{
    int id;               // 0
    char name[8];         // 1
    int idCardNumber[18]; // 2  固定长度身份证编号
    char address[100];    // 3
    int phoneNumber[11];  // 4  固定长度手机号
    long long money;      // 5
    char time[4];         // 6
    float rate;           // 7
    char password[7];     // 8
};
typedef struct list list;

void StoreData(list *target)
{
    FILE *fp;
    size_t size = sizeof(target);

    // 打开文件
    fp = fopen(".\\data.bin", "rb+");
    if (!fp)
    {
        printf("OPEN FILE ERROR\r\n");
        exit(1);
    }

    // 存储数据长度
    fwrite(&size, sizeof(size_t), 1, fp);
    // 储存数据
    fwrite(target, size, 1, fp);

    fclose(fp);
    return;
}

list* RequestData()
{
    FILE *fp;
    size_t size;
    list *data = (list*)malloc(sizeof(list));

    // 打开文件
    fp = fopen(".\\data.bin", "rb+");
    if (!fp)
    {
        printf("OPEN FILE ERROR\r\n");
        exit(1);
    }

    // 读取数据长度
    fread(&size, sizeof(size_t), 1, fp);
    // 根据数据的长度读取文件中的数据
    data = (list*)realloc(data, size);
    fread(data, size, 1, fp);
    fclose(fp);
    return data;
}

int main()
{
    list *p, aa[3];
    list a, b, c;
    a.id = 333;
    b.id = 22;
    c.id = 255;
    aa[0] = a;
    aa[1] = b;
    aa[2] = c;
    StoreData(aa);
    p = RequestData();
    printf("a.id=%d\r\n", p[0].id);
    printf("b.id=%d\r\n", p[1].id);
    printf("c.id=%d\r\n", p[2].id);
    system("pause");
    return 0;
}

运行结果:

为什么a后面的结构体里的数据会是这样的?


2017年6月19日13:06:57补充

(第一次提问问题可能比较模糊请大家见谅……)

是这样的,本人大一,初学c,看到课本上有一段代码如下:

// 这里省略一些代码
struct Student st[3] = {{1001, "tom", 74}, {1002, "jack", 83}, {1003, "lisa", 66}};
// 省略一些代码
fwrite(st, sizeof(st), 1, fp);
fwrite(st, sizeof(struct Student), 3, fp);
// ...

课本上有一段说明是“语句‘fwrite(st, sizeof(st), 1, fp);’和‘fwrite(st, sizeof(struct Student), 3, fp);’是等效的。”

看了两位的回答之后我用下面的代码测试了一下:


#include <stdio.h>

struct list
{
    int id;                // 0
    char name[8];          // 1
    char idCardNumber[19]; // 2  固定长度身份证编号
    char address[100];     // 3
    char phoneNumber[12];  // 4  固定长度手机号
    double money;          // 5
    float rate;            // 7
    char password[7];      // 8
};
typedef struct list list;

void PrintSize(list *target)
{
    printf("target= %u\r\n", sizeof(target));
}

int main()
{
    int a, b[3];
    list l, al[3];
    printf("a=      %u\r\n", sizeof(a));
    printf("b[3]=   %u\r\n", sizeof(b));
    printf("l=      %u\r\n", sizeof(l));
    printf("al=     %u\r\n", sizeof(al));
    PrintSize(al);
}

运行结果如图:

发现确实是这样的,但是请问为什么在本函数里面用数组的首地址就可以计算出来整个数组的大小而传到另一个函数中就不行了呢?

还有如果是因为在另一个函数中的地址只是指向了数组的第一个元素从而导致这样的结果,那这个target的4字节又是指的哪个元素的大小呢?


3个回答

︿ 1

sizeof运算符针对数组会返回数组元素个数,但是如果操作数是一个指针(比如数组蜕变来的指针),那sizoof仅仅计算这个指针的大小。
你设置的编译目标的平台是32位的,这上面的指针就是4字节长度。