用C语言创建二维数组

问题描述 投票:0回答:1

我需要用C语言从CSV文件中读取一个带有某种矩阵的文件(矩阵的列数和行数可能每次都不一样),文件的内容是这样的。

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

我需要读取这个文件,并将其保存为一个二维数组,以便能够通过它进行迭代,并使用李算法找到走出迷宫的路径。

所以我想做这样的事情。

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.
    }
  }
}

然而,行数可能大于列数... ...任何帮助将是感激的。

c arrays multidimensional-array
1个回答
1
投票

如果不知道文件的大小,但必须在解析文件时确定,那么一个简单但有点幼稚的想法是使用一个叫做 char** rows = malloc(n); 哪儿 n 是一个足够大的数字,可以覆盖大多数正常的使用情况。realloc 如果你经过 n.

然后,对于你读取的每一行,将其存储在 rows[i] 通过另一个malloc,然后是strcpymemcpy。

一个更聪明的版本是先读取第一行,找到行长,然后假设文件中所有的行都有这个大小。你可以在文件中做一个 char (*rows)[n] = malloc (n * (row_length+1) ); 来分配一个真正的2D数组。这比 char**,因为你得到了一个合适的缓存友好的二维数组,具有更快的访问速度、更快的分配速度和更少的堆碎片。参见 正确分配多维数组。 以了解这方面的细节。

的另一大优势是 char (*rows)[n] 就是说如果你知道 n 其实你可以 readfread 一次性完成整个文件,这将是一个显著的性能提升,因为文件IO将是这个程序的瓶颈。

如果你不知道 n 你还是要重新分配,万一你最终读到的内容超过了 n 行。所以第三个选择是使用链接列表,这可能是最糟糕的选择,因为它很慢,而且增加了复杂性。唯一的优点是链接列表可以让你快速的添加删除行。

© www.soinside.com 2019 - 2024. All rights reserved.