CSV в массив в C - PullRequest
       6

CSV в массив в C

2 голосов
/ 02 июля 2010

Я пытаюсь загрузить файл CSV в один размерный массив. Я могу вывести содержимое файла CSV, но при попытке скопировать его в массив у меня возникли некоторые проблемы.

Вот мой существующий код, который, как я понимаю, довольно плох, но я учу себя:

#include <stdio.h>
#include <string.h>

#define MAX_LINE_LENGTH 1024
#define MAX_CSV_ELEMENTS 1000000

int main(int argc, char *argv[])
{
    char line[MAX_LINE_LENGTH] = {0};
    int varCount = 0;
    char CSVArray[MAX_CSV_ELEMENTS] = {0};

    FILE *csvFile = fopen("data.csv", "r");

    if (csvFile)
    {
        char *token = 0;
        while (fgets(line, MAX_LINE_LENGTH, csvFile)) 
        {
            token = strtok(&line[0], ",");
            while (token)
            {
                varCount++;
                CSVArray[varCount] = *token; //This is where it all goes wrong
                token = strtok(NULL, ",");
            }
        }
        fclose(csvFile);
    }
    return 0;
}

Есть ли лучший способ, которым я должен это делать? Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 02 июля 2010

*token означает разыменование указателя token, который является адресом первого символа в строке, найденной strtok.Вот почему ваш код заполняет CSVArray только первыми символами каждого токена.

Вы должны иметь массив указателей на символы, указывающих на токены, например:

char *CSVArray[MAX_CSV_ELEMENTS] = {NULL};

Изатем назначьте указатель на его элементы:

CSVArray[varCount] = token;

В качестве альтернативы, вы можете каждый раз копировать весь токен:

CVSArray[varCount] = malloc(strlen(token)+1);
strcpy(CVSArray[varCount], token);
0 голосов
/ 02 июля 2010

Похоже, вы пытаетесь поместить char *, который возвращается из strtok в массив char.

Я думаю, вы хотите объявить CSVArray как:

char * CSVArray[MAX_CSV_ELEMENTS] = {0};
0 голосов
/ 02 июля 2010

Вы правы насчет проблемной линии. Это потому, что вы назначаете указатель, а не копируете текст.

Попробуйте здесь http://boredzo.org/pointers/ для учебника по указателям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...