Czytam plik CSV za pomocą C i chcę go zapisaćtokeny z strtok () w tablicy. W jakiś sposób, gdy plik CSV ma wiele linii, nie otrzymuję poprawnego wyjścia z tokenów. Plik CSV wygląda tak (Tylko dwie linie dla tego przykładu, prawdziwy plik będzie miał więcej niż 100 wierszy):
abc,def,ghi
jkl,mno
Mój kod to:
void main() {
FILE *fp;
fp = fopen("simple.csv", "r");
const char s[2] = ",";
char *token;
char *out[5];
int i = 0;
if (fp != NULL)
{
char line[50];
while (fgets(line, sizeof line, fp) != NULL)
{
token = strtok(line, s);
//for (token; token != NULL; token = strtok(NULL, ","))
while (token != NULL)
{
out[i++] = token;
//printf("%s", token);
token = strtok(NULL, s);
}
printf("%sn", out[0]);
}
//for (i = 0; i < 5; i++)
fclose(fp);
}
else {
printf("error opening file");
}
}
Chcę, aby każdy ciąg rozdzielany przecinkami był przechowywany w tablicy za pomocą pętli. Kiedy wydrukuję pierwszy element tablicy (out[0]
), wyjście to:
abc
jkl
podczas gdy oczekuję, że będzie to tylko żeton:
ABC
Czy ktoś może mi powiedzieć, na czym polega problem?
Odpowiedzi:
1 dla odpowiedzi № 1Problemem jest strtok
zwraca wskaźniki wskazujące na kilka miejsc line
, którego zawartość zmienia się cały czas.
Dlatego musisz skopiować zawartość tokena, a nie tylko przypisać wskaźniki.
Na przykład zdefiniuj out
być:
char out[5][10]; // max of 5 words, each of 10 chars max (including )
i wewnątrz pętli:
strcpy(&out[i++][0], token);