c - 使用 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.
}
}
}
但是,行数可能大于列数。任何帮助将不胜感激
解决方案
如果大小未知但必须在解析文件时确定,那么一个简单但有点幼稚的想法是使用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
行。所以第三种选择是使用链表,这可能是最糟糕的选择,因为它很慢并且增加了复杂性。唯一的优点是链接列表允许您快速添加/删除行。
推荐阅读
- c# - 如何验证是否从 c# 列表中插入了关系记录
- azure-devops - 有没有办法在 VSTS 仪表板中显示项目的完成百分比?
- python - 通过 exe 从 python 尝试时无法从数据库中获取信息
- c - 3 表三角图案
- excel - 通过匹配名称将值从一个 excel 表粘贴到另一个
- java - GraalVM 原生镜像是提高整体应用程序性能还是只是减少启动时间?
- function - 当插值函数必须作为全局变量多次访问时优化 Julia 性能
- docker - 使用 Docker Image 运行量角器脚本
- java - 从 Firebase 存储获取上传时间
- python - 模型作品接受支持向量机 SVM 和线性判别分析