从文件中读取时重复字符串但不重复整数

时间:2013-12-14 12:36:26

标签: c struct scanf

我编写了一个使用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);
    }

}

1 个答案:

答案 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);

此解决方案要求您释放释放食物结构时分配的额外内存。