2015-12-24 76 views
0

我一直在尋找答案,但沒有找到解決這個特定問題的方法。從csv文件讀取並分離成C的變量

我有這個csv文件

enter image description here

想象力,我應該從這個.csv文件創建曲棍球球員

enum POZICE { UTOCNIK = 'U', OBRANCE = 'O', BRANKAR = 'B' }; 

typedef struct hrac { 

int cislo; 
char jmeno[50]; 
enum POZICE pozice; 
int utocnaSila; 
int obrannaSila; 
struct hrac *dalsi; 
} tHrac; 

編號,名稱,播放器的位置(門將,防守者等),他的攻擊力,防守力量以及與下一名球員的聯繫。

創建方法:

void nactiSeznamHracu() { 
char *tmp1[30]; 
char *tmp2[30]; 
char *tmp3[30]; 
char *tmp4[30]; 
char *ch[255]; 

int a = 0; 

FILE* soubor = fopen(SEZNAM, "r"); 

fgets(ch, sizeof(ch), soubor); 
fputs(ch, stdout); 

sscanf(ch, "% [^;]%[^;]", tmp1, tmp2); // parsing whole char *ch into smaller pieces, wont work 
puts(tmp1,tmp2); 

fscanf(soubor, "%c [^;]%s [^;]", tmp3,tmp4); // without saving first line into ch, and cutting it right away 
puts(tmp3); 

//token = strtok(ch, "\n"); 
//puts(token); 

} 

我可以成功地加載第一線,但是當我試圖以某種方式切割線切成小塊

tHrac* vytvorHrace(int cislo, char* jmeno, enum Pozice pozice, int utocnaSila, int obrannaSila) { 

tHrac* hrac = (tHrac*)malloc(sizeof(tHrac)); 
hrac->cislo = cislo; 
strcpy(hrac->jmeno, jmeno); 
hrac->pozice = pozice; 
hrac->utocnaSila = utocnaSila; 
hrac->obrannaSila = obrannaSila; 
hrac->dalsi = NULL; 

} 

現在我的問題的核心,加載方法,像數字,名稱,攻擊,Deffence,位置,它不會工作(或只切割成小塊),我嘗試了很多方法,比我在這裏多,但結果總是一樣的...(前兩個img行不相關,只是測試tHrac,創建和寫作) enter image description here

我的目的是創建一個週期中,將加載第一線,將其加載到seperately變量,我將用它來創建tHrac,然後將其跳過到下一行,同樣的事情...

但我與C的經驗很低,所以這就是爲什麼我打開你。任何人都可以幫忙

回答

1
sscanf(ch, "% [^;]%[^;]", tmp1, tmp2); // parsing whole char *ch into 
puts(tmp1,tmp2); 
fscanf(soubor, "%c [^;]%s [^;]", tmp3,tmp4); 

tmp1tmp2無一不是指針數組30char,並傳遞錯誤的參數會導致不確定的行爲。

在情況下,或者需要使用這些陣列的個別指針分配存儲器給他們後,

或者使用它們作爲數組charchar *,並且需要在後者的情況下分配存儲器中,然後通過他們到sscanffscanf

注意 - 你也應該檢查的sscanffscanf功能return值。