我编写了一个使用fscanf("%s &d &d &d")
从文件中读取的函数。出于某种原因,当我显示输出时,所有整数值都是正确的,但字符串都是相同的。 food_stuff
是数组中的struct
。
*编辑
我尝试使用for
将每个元素从一个数组添加到另一个数组中,我尝试过strcpy
。
这是功能。
int readFromFile()
{
char*name;
int type;
int cals;
int price;
FILE * food_file;
food_file = fopen ("food_file.txt", "r");
while(fscanf(food_file, "%s %d %d %d", name, &type, &cals, &price)!=EOF)
{
food_stuff fs;
fs.name = name;
fs.type = type;
fs.calories = cals;
fs.price = price;
fflush(stdin);
addItem(fs);
}
}
答案 0 :(得分:1)
正如评论者已经指出的那样,您需要为变量name
分配内存。因为变量是临时的,所以你可以在堆栈上声明一个本地char数组而不是堆上的allocationg内存:
char name[40];
您的问题是结构中的name
字段可能也只是指向char的指针。对于您生成的所有footstuff结构,该指针指向name
,这对于所有实例都是相同的,只有不同的内容。 (更糟糕的是:如果您离开readFromFile
,该缓冲区将不再存在,使每种食物的name
字段无效。)
一种可能的解决方案是使name
字段也成为缓冲区,例如:
typedef struct food_stuff food_stuff;
struct food_stuff {
char name[40];
int type;
int cals;
int price;
};
将读取数据分配给结构时,请勿复制指针,而应使用strcpy
复制内容。 (您需要包含<string.h>
):
strcpy(fs.name, name);
此解决方案假设所有名称的长度都小于39个字符,这对于实际数据来说不是一个安全的假设。您应在%s
的调用中以fscanf
格式指定宽度。
另一个解决方案是保留struct定义,因为我假设它现在是char *name
并为每个新结构分配内存。但是你仍然需要复制内容:
fs.name = malloc(strlen(name) + 1);
// error check omitted
strcpy(fs.name, name);
此解决方案要求您释放释放食物结构时分配的额外内存。