簡體   English   中英

從文件讀取時重復字符串但不返回整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM