Аз чета CSV файл с C и искам да го съхранявамсимволите от strtok () в масив. По някакъв начин, когато CSV файлът има няколко реда, не получавам правилния изход на символите. Файлът CSV изглежда така (Само два реда за този пример, истинският файл ще има повече от 100 реда):
abc,def,ghi
jkl,mno
Моят код е:
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");
}
}
Искам всеки отрязъци, дефинирани със запетая, да се съхранява в масив чрез линия. Когато разпечатам първия елемент на масива (out[0]
), изходът е:
abc
jkl
докато аз очаквам това да е само символът:
абв
Може ли някой да ме уведомите какъв е проблемът?
Отговори:
1 за отговор № 1Проблемът е, че strtok
връща указатели, сочещи към няколко места line
, чието съдържание се променя през цялото време.
По този начин трябва да копирате съдържанието на означението, а не просто да зададете указатели.
Например, дефинирайте out
да бъде:
char out[5][10]; // max of 5 words, each of 10 chars max (including )
и вътре в цикъла:
strcpy(&out[i++][0], token);