我需要用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.
}
}
}
然而,行数可能大于列数... ...任何帮助将是感激的。
如果不知道文件的大小,但必须在解析文件时确定,那么一个简单但有点幼稚的想法是使用一个叫做 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
其实你可以 read
fread
一次性完成整个文件,这将是一个显著的性能提升,因为文件IO将是这个程序的瓶颈。
如果你不知道 n
你还是要重新分配,万一你最终读到的内容超过了 n
行。所以第三个选择是使用链接列表,这可能是最糟糕的选择,因为它很慢,而且增加了复杂性。唯一的优点是链接列表可以让你快速的添加删除行。