我正在尝试将文件读入动态分配的2d数组,但我一直打印出相同的行。我在这段代码中添加的文件是一个1000行的.txt文件。最后的打印是检查阵列是否获得正确的数据。最后,我试图重新分配,因为代码适合放入数组的行数。谢谢:)
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
int main(void)
{
char buffer[349];
char *del = "";
int i = 0;
int count = 0;
int len = 100;
int row = 10;
int max = 10;
char** d;
d = malloc(row * sizeof(char*));
for(i = 0; i < row; i++)
{
d[i] = malloc(349);
}
i = 0;
while (fgets(buffer, sizeof(buffer), stdin) != NULL)
{
d[i] = buffer;
i++;
if(i == max)
{
d = realloc(d, sizeof(d)*2);
for(i = max; i <= max*2; i++)
{
d[i] = malloc(349);
}
max = max * 2;
printf("reallocating to %d\n", max);
}
}
for(i = 0; i < 20; i++)
{
printf("%s\n", d[i]);
printf("%lu\n", sizeof(d[i]));
}
}
txt文件上的示例行:
2152,1,MAIN,SOCW,6390,006,22913,IND - 独立研究,0,1,1,0,0,12:00 AM,12:00 AM,N,N,N,N, N,N,N,01-20-2015,05-08-2015
文件中大约有1000行。
答案 0 :(得分:0)
d
看起来不像任何东西的“2D数组”。数组是连续的。你的分配不是。我建议您更改d
的类型并避免过多的分配。
char (*d)[349] = NULL;
size_t d_size = 0;
检查d_size
是否为二进制功率(幂2
)以确定何时调整大小,并通过加倍调整大小:
if ((d_size & (d_size + 1)) == 0) {
void *temp = realloc(d, (2 * d_size + 1) * sizeof *d);
if (temp == NULL) {
perror(realloc);
exit(EXIT_FAILURE);
}
d = temp;
}
由于d
从NULL
开始,d_size
以二进制功率(0
)开始,因此容量检查需要在分配之前进行。您可以删除buffer
作为结果。
不需要存储d
的容量,因为我们知道它将是我们通过反复递增d_size
而获得的第一个二进制功率。如果您愿意,d_size
会成为您的i
。
除此之外,BLUEPIXY在评论中解决了您的问题。通过一次更正,这些是:
strcpy(d[i], buffer);
d = realloc(d, sizeof(*d)*max*2);
for(int j = max; j < max*2; j++){ d[j] = malloc(349);}
printf("%zu\n", strlen(d[i]));
至少需要这四个才能让你的程序正常工作(无论这意味着什么),但你也应该考虑这两个:
d = realloc(d, ...);
失败并返回NULL
时,您之前的d
值会发生什么变化?它泄漏到稀薄的空气中。您应该将d
的返回值存储到temp
变量(例如下方)中,并在继续之前检查NULL
。free
任何记忆malloc/realloc
d。将迄今为止仍然适用的内容集成到我迄今为止所学到的内容中:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char (*d)[349] = NULL;
size_t d_size = 0;
for (;;)
{
if ((d_size & (d_size + 1)) == 0)
{
void *temp = realloc(d, (2 * d_size + 1) * sizeof *d);
if (temp == NULL)
{
break;
}
d = temp;
}
if (fgets(d[d_size], sizeof d[d_size], stdin) == NULL) {
break;
}
d_size++;
}
for (size_t i = 0; i < d_size; i++)
{
printf("%s\n", d[i]);
printf("%zu\n", strlen(d[i]));
}
free(d);
}