2014-12-06 86 views
-2

我有一個由「|」分隔的單詞和數字文件我需要將它們加載到一個結構體中,以便稍後使用它們。這是一個國家,它們的貨幣和匯率的文件,我需要把它們分解成一個結構,然後和它們一起工作。基本上我需要創建一個C貨幣交換程序。如何從文本文件加載CSV以正確構造C?

數據在文件中是這樣的:

country|currency|quantity|code|rate of exchange 
Canada|dollar|1|CAD|19,430 

這是結構的樣子(FILE * currencies = fopen("denni_kurz.txt", "r"))

struct data 
{ 
    char buffer[100]; 
    char country[40]; 
    char nameofcurrency[20]; 
    int quantity; 
    char code[5]; 
    float exchangerate; 
}currency[40]; 

然後,我有一個循環加載所有的人:

while (!feof(currencies)) 
{ 

} 

這裏的問題是,我閱讀文檔,但它只是不適合我。 任何人都可以給我一個關於如何加載他們屬於他們的提示嗎?

+1

'while(!feof(currency))'''不好主意。 – BLUEPIXY 2014-12-06 10:46:02

+0

是否使用「緩衝區」?我不明白19,430的匯率。它不應該像1.14那樣?或者逗號用作小數點? – Marichyasana 2014-12-06 11:14:26

+0

這是一個小數點,是的。我以爲我會讀整個東西,加載到緩衝區,然後用strtok把它分解成小塊,但它不適合我,所以我做錯了什麼。 – greav 2014-12-06 11:16:41

回答

2

您可以使用sscanf函數加載CSV文件。默認情況下,sscanf()會將空格作爲分隔符。你可以指定|在sscanf中並將其存儲在結構中。 首先使用fgets從csv文件獲取行並將其存儲在數組中。 然後獲取數組中的行並存儲在結構中。

eg:  while(fgets(array,BUFSIZ,fp) != NULL) 
      sscanf(array," %d | %s | %s | %d | %d | %s | %f | %[0-9]s",&account[i].customer_id,account[i].name,account[i].address,&account[i].account_number,&account[i].age,account[i].sex,&account[i].balance_amount,account[i].mobile_number); 

然後,如果您打印結構變量將打印相應的值。

printf("id:%d\n name:%s\n address:%s\n account number:%d\n age:%d\n sex:%s\n balance:%f\n mobile:%s\n",account[j].customer_id,account[j].name,account[j].address,account[j].account_number,account[j].age,account[j].sex,account[j].balance_amount,account[j].mobile_number); 
+0

試過這個,但它並沒有真正的工作,我得到一些數據,然後很多隨機符號。 – greav 2014-12-06 12:22:19

+0

我已經使用sscanf上傳csv文件。並且文件已經上傳。那爲什麼我建議你使用。你可以發佈你使用過的代碼片段嗎? – sharon 2014-12-06 13:20:17

0

如果沒有什麼幫助,你可以隨時恢復到愚蠢cahracter處理,如:線

struct data *p= currency; 
while (fgets(p->buffer,100, currencies)) { 
    char *cp1= p->buffer; 
    char *cp2= p->buffer; 
    while (*cp2!='|') cp2++; 
    strncpy(p->country, cp1, cp2-cp1); p->country[cp2-cp1]='\0'; 
    cp2++; cp1=cp2; 
    // etc.... 
    p++; // next line 
} 

當然,你還需要添加相應的檢查(不處理過去的結束,沒有結束貨幣陣列,而不是國家名稱太長,不...)

+0

謝謝你的建議,我通過strncpy,strtok,atoi和atof工作。 – greav 2014-12-06 15:34:21