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。
答案 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说的更简单。