从csv文件中读取并在C中分离成变量

时间:2015-12-24 13:01:01

标签: c file csv variables input

我一直在这里寻找答案,但没有找到解决这个特殊问题的方法。

我有这个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;

球员的数量,名称,位置(守门员,防守者等),他的攻击力,防守力以及与下一位球员的联系。

创建方法:

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;

}

现在是我的问题的核心,加载方法

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);

}

我可以成功加载第一行,但是当我尝试以某种方式将线条切割成较小的部分,如数字,名称,攻击,Deffence,位置,它将无法工作(或仅将标题切割成较小的部分),我试过很多方面,比我在这里更多,但结果总是一样的...(前两行的img是无关的,只是测试tHrac,创建和写作) enter image description here

我的目的是为循环创建它将加载第一行,将其单独加载到变量中,我将用它创建tHrac然后它跳到下一行和同样的事情......

但我对C的体验很低,所以这就是我打开你的原因。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

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

tmp1tmp2以及所有指向30的指针的数组char,并且传递错误的参数会导致未定义的行为。

如果您需要在为其分配内存后使用这些数组的单个指针

或者将它们用作charchar *的数组,并且您需要在后一种情况下分配内存,然后将它们传递给sscanffscanf

注意 - 您还应该检查returnsscanf功能的fscanf值。