2013-12-14 53 views
0

我已經編寫了使用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); 
    } 

} 
+3

有兩件事:(i)您需要爲'name'字段分配內存,(ii)從不在'stdin'上調用'fflush'。 –

+0

@PaulR我用'name =(char *)malloc(20 + 1);'分配了內存並擺脫了'fflush(stdin);'但沒有任何改變。沖洗標準輸入是否確實做了什麼? – Aezur

+1

問題可能出現在你的'additem'函數中。可以肯定的是,在調用'additem'之前打印這些值。 – Dipto

回答

1

作爲評論者已經指出,您需要爲變量name分配內存。由於變量是暫時的,你可能只需要聲明,而不是在堆上allocationg存儲在堆棧上的本地字符數組:

char name[40]; 

你的問題是,在你的結構name領域可能也是唯一的字符指針。該指針指向您生成的所有腳本結構的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); 

此解決方案要求在釋放食品結構時釋放分配的額外內存。

+0

@M歐姆感謝您提供最優秀,最全面的答案。度(工作) – Aezur

相關問題