Ошибка при чтении csv-файла в структуру

У меня проблемы с чтением данных из csv-файла и их синтаксическим анализом в структуре. Я думаю, что лучше показать некоторый код.

Это моя структура:

typedef struct MyStruct{
    char text[150];
    char attr[4][50];
    char check;
    short int num;
} t_mystruct;

Пример строки в моем файле может выглядеть следующим образом: это длинный текст: коричневый, зеленый, желтый, тихий, X;13;

Теперь я хочу прочитать этот файл и добавить эти данные в массив:

list = malloc(sizeof(t_mystruct) * LIST_SIZE); /* Allocating Memory */

for (i = 0; i < LIST_SIZE; i++) /* Adding data to list */
{
    t_mystruct element;

    if (fscanf(fp, "%149[^;];%49[^;];%49[^;];%49[^;];%49[^;];%49[^;];%[^;];%d;", &element.text, &element.attr[0], &element.attr[1], &element.attr[2], &element.attr[3], &element.check, &element.num) != 7)
        break; /* Break ==> Incomplete line/data */

    list[i] = element;  /* Add to list */
}

Это работает, но я сталкиваюсь с двумя проблемами:

  1. Значение "num" не совпадает со значением в моем файле. Я получаю результаты от 49 до примерно 13000, но они никогда не соответствуют моему фактическому входному значению (13 в моем примере).
  2. Код принадлежит функции "readFile". В конце этой функции я сталкиваюсь с ошибкой "стек вокруг переменной" элемента "поврежден". Изменить: при отладке я могу продолжить, и программа работает, как ожидалось.

Но я не вижу своих ошибок.

1 ответ

Решение

Вы указали пять спецификаторов формата

%49[^;];

но ваша структура имеет только четыре, и вы предоставляете только четыре аргумента для сопоставления. Вы также читаете последнее значение как int, когда он является short,

Другие вопросы по тегам