首页 > 解决方案 > 使用 C 创建二维数组/矩阵

问题描述

我需要使用 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.
    }
  }
}

但是,行数可能大于列数。任何帮助将不胜感激

标签: carraysmultidimensional-array

解决方案


如果大小未知但必须在解析文件时确定,那么一个简单但有点幼稚的想法是使用char** rows = malloc(n);一个n足够大的数字来覆盖大多数正常用例。realloc如果你过去n

然后对于您读取的每一行,rows[i]通过另一个 malloc 将其存储在内部,然后是 strcpy/memcpy。

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

另一个很大的优点char (*rows)[n]是,如果你n事先知道,你实际上可以一次read/fread整个文件,这将是一个显着的性能提升,因为文件 I/O 将成为这个程序的瓶颈。

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


推荐阅读