C - Как извлечь разные столбцы из одной строки?
У меня был файл CSV. Мне удалось преобразовать все запятые в пробелы, и я поместил все это в одну массивную строку. Когда я распечатываю строку, я получаю такие данные:
DATA1 STUFF1 10 0,1 550 120 140 0,121DATA2 STUFF2 20 0,1 250 250 200 0,022
DATA3 STUFF3 30 0,1 120 330 10 0,064
DATA4 STUFF4 40 0,1 920 380 10 0,193
так далее
В настоящее время у меня проблема в том, что когда я сканирую данные в свой массив stuct, предназначенный для хранения этих данных, он просто выдает первую строку снова и снова, игнорируя остальные. Поэтому, когда я распечатываю это, я просто получаю
DATA1 STUFF1 10 0,1 550 120 140 0,121
DATA1 STUFF1 10 0,1 550 120 140 0,121
DATA1 STUFF1 10 0,1 550 120 140 0,121
DATA1 STUFF1 10 0,1 550 120 140 0,121
i=0;
while(i<MAX)
{
sscanf(str, "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2,
&datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4,
&datas[i].n5, &datas[i].n6);
i++;
}
MAX - это количество записей в файле CSV, datas - это мой массив структур, str - строка, в которой я сохранил все данные без пробелов, а я - просто целое число.
Фактическая структура:
struct data{
char c1[10], c2[10];
int n1, n3, n4, n5;
float n2, n6;
};
struct data datas[MAX];
У кого-нибудь есть решение? Новичок в C, поэтому, пожалуйста, объясните, как я 5.
2 ответа
Через несколько итераций цикла вы пропускаете одну и ту же строку (т. Е. Строка указывает на одно и то же место - начало строки), что приводит к анализу одинаковых значений.
Вам нужно продвинуть строку, чтобы она указала на правильное местоположение в строке для последующих операций scanf.
Вы можете, вероятно, иметь некоторый разделитель в строке в конце "одного набора" данных и использовать strtok или подобные функции для перемещения внутри строки.
sscanf(str, "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2,
&datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4,
&datas[i].n5, &datas[i].n6);
Как вы сказали, что str
это большая строка, поэтому содержание членов вашей структуры остается неизменным. Пожалуйста, измените ваш код, если возможно использовать str
в качестве массива указателей, а затем использовать
sscanf(str[i], "%s %s %d %f %d %d %d %f", &datas[i].c1, &datas[i].c2,
&datas[i].n1, &datas[i].n2, &datas[i].n3, &datas[i].n4,
&datas[i].n5, &datas[i].n6);
Пожалуйста, проверьте, как объявить и использовать массив указателей.