试图将文件读入动态分配的2d数组

时间:2015-04-09 01:54:45

标签: c arrays dynamic 2d allocation

我正在尝试将文件读入动态分配的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行。

1 个答案:

答案 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;
}

由于dNULL开始,d_size以二进制功率(0)开始,因此容量检查需要在分配之前进行。您可以删除buffer作为结果。

不需要存储d的容量,因为我们知道它将是我们通过反复递增d_size而获得的第一个二进制功率。如果您愿意,d_size会成为您的i


除此之外,BLUEPIXY在评论中解决了您的问题。通过一次更正,这些是:

  1. strcpy(d[i], buffer);
  2. d = realloc(d, sizeof(*d)*max*2);
  3. for(int j = max; j < max*2; j++){ d[j] = malloc(349);}
  4. printf("%zu\n", strlen(d[i]));
  5. 至少需要这四个才能让你的程序正常工作(无论这意味着什么),但你也应该考虑这两个:

    • 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);
    }