У вас есть ряд проблем.Для начала:
rows = readParts(ifp);
fseek(ifp, 0, SEEK_SET); /* rewinds to beginning */
columns = readConfigs(ifp); /* re-reads rows values as columns */
fseek(ifp, 0, SEEK_SET); /* rewinds to beginning -- again */
Избавьтесь от fseek(ifp, 0, SEEK_SET);
вызовов, оставив только:
rows = readParts(ifp);
columns = readConfigs(ifp);
Далее:
char arr[rows][columns];
объявляет массив переменной длины , хранилище полностью зарезервировано, и выделение не требуется.Если вы хотите динамически распределить, вам нужно будет объявить rows
количество указателей, а затем columns
число int
на указатель.(Вы также можете объявить указатель на VLA int (*)[columns]
, но, поскольку columns
не является константой времени компиляции, это не рекомендуется).Удалите arr[rows][columns] = malloc(sizeof(int)*rows*columns);
Далее, чтобы прочитать файл в массив, просто сохраните правильные счетчики r
(строка) и c
(столбец), а затем прочитайте каждое целое число в файле с помощью fscanf (ifp, "%d", &arr[r][c])
(илииспользуйте fgets()
, чтобы прочитать строку в буфере, а затем проанализировать значения из строки с помощью sscanf
)
Например:
int r = 0, c = 0;
while (fscanf (ifp, "%d", &arr[r][c++]) == 1) {
/* check if row full */
if (c == columns) {
r++; /* advance row count */
if (r == rows) /* protect arr bounds */
break;
c = 0; /* reset column count zero */
}
}
( примечание: Вы упомянули .csv
, но не предоставили никаких примеров ввода из файла. Если файл на самом деле разделен запятой , вам нужно будет передвигать указатель чтения за запятой (или до '\n'
или EOF
найдено) после каждого целочисленного чтения в цикле)
В этот момент вы заполнили свой массив каждым целочисленным значением в файле, и вы сделали так, чтобы каждая сохраненная строка / столбецзначения остаются в пределах ваших arr
.
Дайте мне знать, если у вас есть дополнительные вопросы.