因此,对于我的学校项目,将通过stdin
输入一个大型CSV文件,我们必须根据列对其进行排序,并将其打印为已排序的csv文件。
我现在所采取的步骤是弄清楚如何保留realloc
struct
个数组,以便在数据不足以容纳来自{{{{1}的数据时它会增长1}}。我们不知道将在CSV文件中输入的确切行数。现在我们只使用静态金额来测试并查看值是否已分配给stdin
。
我仍然是C的初学者,所以我不清楚我是如何迭代指针的,就像我会迭代一个数组一样。由于我们在数组中使用静态数量的struct
s,我们可以像在Java中一样使用struct
进行迭代,但是如何迭代array[i]
之类的东西呢?
我不知道从哪里开始创建这个动态数组。我试过了
*array
但是我不知道如何使用struct array* testArray = (array*)malloc(sizeof(testArray));
像使用静态数组那样迭代它。
非常感谢任何帮助,对不起文字之墙......
答案 0 :(得分:0)
struct array* testArray = (array*)malloc(sizeof(testArray));
有点不对,因为你只分配了1个testArray元素。
更像是:
struct A
{
int a;
int b;
....
};
struct A* arr = malloc( N * sizeof(struct A) );
^^^
N element of struct A
int j;
for (j=0; j<N; ++j) // Iterate it like any other array
{
arr[j].a = 5;
arr[j].b = 42;
....
}
当您需要增加阵列时使用realloc
。
从文件/标准输入读取时,它可能看起来像(基于David C. Rankin的评论):
int n=0; // Count of the number of structs read from the file
struct A* arr = malloc( N * sizeof(struct A) );
while (read line from file)
{
arr[n].a = val1;
arr[n].b = val2;
++n; // Increment count
if (n == N) // Check if current array is full, i.e. realloc needed
{
// realloc array to 2 * N; N = N * 2
}
}
答案 1 :(得分:0)
您可以像使用数组一样浏览malloced空间(使用标记),但似乎您的主要问题在于使用malloc。 Malloc的参数是您要分配的 bytes 的数量。因此,如果你想拥有一个结构数组,首先需要找出一个结构包含sizeof(struct array)
所包含的字节数,然后确定你想要多大的数组,比方说N
。因此,该代码行应该更像struct array* testArray = malloc(N * sizeof(struct array));
。 malloc的返回值将是一个void指针,其中包含已分配空间的第一个字节的内存地址。将此值分配给testArray后,它将被类型转换为指定的变量类型(struct array *
)。现在,您可以使用指针算法来访问具有i
的特定索引*(testArray + i)
,或者只使用testArray [i]。如果您发现N
的大小不够,可以使用realloc将数组大小增加到2N
,或者认为必要的大小。