[英]Repeating strings but not ints when reading from files
我編寫了一個函數,該函數使用fscanf("%s &d &d &d")
來讀取文件。 由於某種原因,當我顯示輸出時,所有整數值都是正確的,但是字符串都相同。 food_stuff
是保存在數組中的struct
。
* EDIT我嘗試使用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);
}
}
正如評論者已經指出的那樣,您需要為變量name
分配內存。 因為該變量是臨時變量,所以您可以在堆棧上聲明一個本地char數組,而不是在堆上聲明g內存:
char name[40];
您的問題是結構中的name
字段也可能只是char的指針。 該指針指向您生成的所有腳結構的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個字符,這對於真實數據而言不是一個安全的假設。 您應在對fscanf
的調用中以%s
格式指定寬度。
另一個解決方案是保留結構定義,因為我假設它現在使用char *name
並為每個新結構分配內存。 但是,您仍然必須復制內容:
fs.name = malloc(strlen(name) + 1);
// error check omitted
strcpy(fs.name, name);
此解決方案要求您釋放食物結構時釋放分配的額外內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.