我已经习惯了PHP,但我开始学习C。我正在尝试创建一个程序,它可以逐行读取文件,并将每行存储到一个数组中。
到目前为止,我已经有了一个逐行读取文件的程序,甚至可以打印每一行,但现在我只需要将每一行添加到一个数组中。
我的朋友昨晚告诉我一点。他说我必须在C中使用多维数组,所以基本上是array[x][y]
。[y]
部分本身很容易,因为我知道每行将是的最大字节量。但是,我不知道这个文件有多少行。
我想我可以让它在文件中循环,每次只增加一个整数,然后使用它,但我觉得可能有一种更简单的方法。
接下来我可以尝试什么?
6条答案
按热度按时间qq24tv8q1#
要动态分配2D阵列,请执行以下操作:
修改上述方法。当您需要添加另一行时,执行
*(p + i) = malloc (sizeof (char) * dim2);
并更新i
。在这种情况下,您需要预测文件中的最大行数,该文件由dim1
变量表示,我们第一次为其分配p
数组。这将只分配(sizeof (int *) * dim1)
字节,因此比char p[dim1][dim2]
(在c99中)好得多。我认为还有另一种方法。在区块中分配数组,并在溢出时将它们链接起来。
在此之后,第一个块准备好使用。当你需要插入一行代码时,只需要:
当
n
是LINE_MAX
时,分配另一个块并将其链接到该块。就像这样
当一个块的
n
变为0
时,释放它,并将当前块指针file
更新为前一个块指针。你可以从开始遍历单链表和从开始遍历或使用双链接。643ylb082#
C中没有标准的可调整大小的数组类型。你必须自己实现它,或者使用第三方库。下面是一个简单的基本示例:
这样使用它:
当然,这仅适用于
int
s的数组。由于C没有模板,因此您必须将所有这些代码放在每个不同类型数组的宏中(或者使用不同的预处理器,如GNU m4)。或者,你可以使用一个通用的数组容器,它要么使用void*
指针(要求所有数组元素都是malloc
的),要么使用不透明的内存blob,这将需要对每个元素访问进行强制转换,并对每个元素get/set进行memcpy
。不管怎么说,这都不好看。二维数组甚至更难看。
xv8emn3q3#
除了数组,你也可以使用链表,代码更简单,但分配更频繁,可能会出现碎片。
只要你不打算做太多的随机访问(这里是O(n)),迭代就像一个普通的数组一样简单。
oxf4rvwz4#
如果你使用的是C语言,你需要自己实现数组的大小调整。C++和SDL已经为你做了这件事。它被称为
vector
。http://www.cplusplus.com/reference/stl/vector/aamkag615#
虽然多维数组可以解决这个问题,但矩形2D数组并不是自然的C解决方案。
下面是一个程序,它首先将文件读入一个链表,然后分配一个大小合适的指针向量。每个单独的字符都显示为
array[line][col]
,但实际上每行只有它需要的长度。是C99除了<err.h>
jgzswidk6#
您可以使用
malloc
和realloc
函数动态分配和调整指向char
的指针数组的大小,数组的每个元素将指向从文件中读取的字符串(该字符串的存储也是动态分配的)。为了简单起见,我们假设每一行的最大长度小于M个字符(包括换行符),所以我们不必对每一行进行任何动态调整。每次扩展数组时,都需要手动跟踪数组大小。一个常用的技巧是每次扩展时将数组大小加倍,而不是按固定大小扩展;这最小化了对
realloc
的调用的数量,这可能是昂贵的。当然,这意味着你必须记录两个量;数组的总大小和当前读取的元素数。示例: