создать двумерный массив / матрицу, используя C - PullRequest
0 голосов
/ 29 апреля 2020

Мне нужно прочитать файл с какой-то матрицей из CSV-файла (количество столбцов и строк матрицы может каждый раз отличаться), используя C. Файл будет выглядеть примерно так:

#,#,#,#,#,#,.,#,.,.,.$
#,.,#,.,.,#,.,#,#,#,#$
#,.,#,.,.,.,.,.,.,#,#$
#,.,#,.,.,#,#,#,#,#,#$
#,.,.,#,.,.,.,.,.,.,#$
#,.,.,.,#,.,#,#,.,.,#$
#,.,.,.,.,#,.,.,.,.,#$
#,.,.,.,.,#,.,.,.,.,#$
#,.,.,.,.,.,.,.,.,.,#$
#,#,#,#,#,#,#,#,#,.,#$

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

Так что я хочу сделать somenthing как:

int fd = open (argv[i], O_RDONLY);

    while (read(fd, &ch, 1)) {
     here should be some for loops to find the  number of colums and rows. 
    }

К сожалению, я не знаю, как это сделать, если высота и ширина матрицы неизвестны.

Я пытался сделать это:

while (read (fd, &ch, 1)) {
  for (int i = 0; arr[i] != '\0'; i++) {
    for (int j = 0; j != '\n'; j++) {
      somehow save the values, number of columns and rows.
    }
  }
}

Однако количество строк может быть больше, чем количество столбцов. Любая помощь будет оценена

1 Ответ

1 голос
/ 29 апреля 2020

Если размер неизвестен, но должен быть определен при разборе файла, тогда простой, но немного наивной идеей было бы использовать char** rows = malloc(n);, где n - достаточно большое число, чтобы охватить большинство нормальных случаи использования. realloc если вы go мимо n.

Затем для каждой прочитанной строки сохраните ее внутри rows[i] через другой mallo c, за которым следует strcpy / memcpy.

Более умной версией будет чтение первого row, найдите длину строки и затем предположите, что все строки в файле имеют этот размер. Вы можете сделать char (*rows)[n] = malloc (n * (row_length+1) );, чтобы выделить истинный 2D-массив. Это имеет преимущества по сравнению с char**, поскольку вы получаете надлежащий кеш-2D массив с более быстрым доступом, более быстрым распределением и меньшей фрагментацией кучи. Подробнее об этом см. Правильное распределение многомерных массивов .

Другое большое преимущество char (*rows)[n] заключается в том, что если вы знаете n заранее, вы можете read / fread весь файл в одном go, что значительно повысит производительность, поскольку файловый ввод / вывод будет узким местом в этой программе.

Если вы не знаете n заранее, вам все равно придется перевести c на случай, если вы в конечном итоге прочитаете более n строк. Поэтому третьим вариантом будет использование связанного списка, который, вероятно, является худшим вариантом, поскольку он медленный и добавляет сложности. Единственное преимущество заключается в том, что список ссылок позволяет быстро добавлять / удалять строки на лету.

...