结构为二进制

时间:2018-03-22 12:15:53

标签: c

typedef struct {
    char name[31];
    float price;
    int in_stock;
} Prod;


int binary(const char* filename, Prod* store){

    char NAME = store->name;

    float PRICE = store->price;

    int STOCK = store->in_stock;


    FILE *fp = fopen(filename, "w");

    if(fp == NULL){return 1;}


    fwrite(&(NAME), sizeof(NAME), 1, fp);
    fwrite(&(PRICE), sizeof(PRICE), 1, fp);
    fwrite(&(STOCK), sizeof(STOCk), 1, fp);
    return 0;
}

我的任务是从struct做二进制文件。我收到以下警告:

  

"初始化从没有强制转换的指针生成整数"在线   NAME = store->name.

如果此代码错误,你能告诉我们应该如何正确地完成这项工作。如果文件写入成功则代码必须返回0,其他情况下代码必须返回1。

1 个答案:

答案 0 :(得分:1)

char *指针是指向一个char的指针,如果你指向一个字符串,通常是字符串中的第一个。

创建数组时,如果将其赋值给某个函数或将其传递给函数,它将成为指向数组中第一个成员的指针。所以:

char name[31];
char NAME = name;

标识符NAME必须是char *指针。这就是你得到的错误

  

"初始化从指针生成整数而没有强制转换"

所以如果你写:

char* NAME = store->name;

这将有效。

但是你有另一个问题。

fwrite(&(PRICE), sizeof(PRICE), 1, fp);
fwrite(&(STOCK), sizeof(STOCK), 1, fp);

写得不错,但你不能写一个char *,因为char *只是你字符串第一个字符的地址。您将需要执行以下操作:

fwrite(NAME, sizeof(char), strlen(NAME), fp);

将字符串写入文件流。然后你需要终止它:

putc(0, fp);

你把这个空终止字符放在一边,所以当你读回文件流时,你知道要读取多少字节来获取字符串。如果你不想这样做,你可以为字符串分配一组固定的字节,如果你确定字符串不会溢出这个缓冲区。所以:

fwrite(NAME, sizeof(char), 32, fp);

现在您知道从文件流中读回的时间是为字符串预留了前32个字节。

再次,fwrite(NAME,sizeof(NAME),1,fp);除了写一个地址到文件流之外什么都不做。你需要使用我提到的两种方法之一。

编辑:甚至更好,做Johnny Mopp说的更简单。