Ошибка при чтении 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 */
}
Это работает, но я сталкиваюсь с двумя проблемами:
- Значение "num" не совпадает со значением в моем файле. Я получаю результаты от 49 до примерно 13000, но они никогда не соответствуют моему фактическому входному значению (13 в моем примере).
- Код принадлежит функции "readFile". В конце этой функции я сталкиваюсь с ошибкой "стек вокруг переменной" элемента "поврежден". Изменить: при отладке я могу продолжить, и программа работает, как ожидалось.
Но я не вижу своих ошибок.
1 ответ
Решение
Вы указали пять спецификаторов формата
%49[^;];
но ваша структура имеет только четыре, и вы предоставляете только четыре аргумента для сопоставления. Вы также читаете последнее значение как int
, когда он является short
,