使用C创建二维数组/矩阵

使用C创建二维数组/矩阵,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我需要使用C从CSV文件中读取一个带有某种矩阵的文件(每次矩阵列和行的数量可能不同)。 该文件将类似于: #,#,#,#,#,#,.,#,.,.,.$ #,.,#,.,.,#,.,#,#,#,#$ #,.,#,.,.,.,.,.,.,#,#$ #,.,#,.,.,#,#,#,#,#,#$ #,.,.,#,.,.,.,.,.,.,#$ #,.,.,.,#,.,#,#,.,.,#$ #,.,.,.,.,#,.,.,.,.,#$ #,.,.,.,.,#,.,.,.,.,#$ #,.,.,.,.,.,.

我需要使用C从CSV文件中读取一个带有某种矩阵的文件(每次矩阵列和行的数量可能不同)。 该文件将类似于:

#,#,#,#,#,#,.,#,.,.,.$
#,.,#,.,.,#,.,#,#,#,#$
#,.,#,.,.,.,.,.,.,#,#$
#,.,#,.,.,#,#,#,#,#,#$
#,.,.,#,.,.,.,.,.,.,#$
#,.,.,.,#,.,#,#,.,.,#$
#,.,.,.,.,#,.,.,.,.,#$
#,.,.,.,.,#,.,.,.,.,#$
#,.,.,.,.,.,.,.,.,.,#$
#,#,#,#,#,#,#,#,#,.,#$
我需要读取该文件并将其保存到二维数组中,以便能够遍历它并使用Lee算法找到走出迷宫的路径

所以我想做一些事情,比如:

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.
    }
  }
}
但是,行数可以大于列数。
如果大小未知,但必须在解析文件时确定,那么使用
char**rows=malloc(n)将是一个简单但有点幼稚的想法其中
n
是一个足够大的数字,足以覆盖大多数正常用例
realloc
如果您经过
n

然后,对于您读取的每一行,通过另一个malloc(后跟strcpy/memcpy)将其存储在
行[i]

更聪明的版本是,首先读取第一行,找到行长度,然后假设文件中的所有行都具有该大小。你可以做一个
char(*rows)[n]=malloc(n*(row_length+1))以分配真实的二维数组。这比
char**
更具优势,因为您可以获得一个适当的缓存友好型2D阵列,该阵列具有更快的访问速度、更快的分配速度和更少的堆碎片。有关详细信息,请参阅

char(*rows)[n]
的另一大优点是,如果您事先知道
n
,您实际上可以
一次读取整个文件,这将大大提高性能,因为文件I/O将是该程序的瓶颈

如果您事先不知道
n
,您仍然需要重新定位,以防您最终读取的行数超过
n
。所以第三种选择是使用链表,这可能是最糟糕的选择,因为它速度慢而且增加了复杂性。唯一的优点是链接列表允许您快速添加/删除行