2015-12-24 69 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值。