C - 将非常大的文件中的行插入到数组中

标签 c arrays file pointers malloc

首先,我是 C 的新手,我知道这是一个非常重复的问题,但是,我找不到任何可以帮助我解决问题的东西。

这是我的代码: 它接受一个文本文件并将每一行存储在一个数组中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    FILE *file;
    file = fopen("test.txt", "r");
    char buffer[600];
    char *lines[10000];
    int i = 0;

    while(fgets(buffer, sizeof(buffer), file))
    {

        lines[i] = malloc(sizeof(buffer));
        strcpy(lines[i], buffer);
        i++;
        free(lines[i]);
    }

    fclose(file);


    return 1;
}

这适用于小型文本文件。

但是它不适用于大的(甚至设置缓冲区和具有更大数字的行)。实际上,如果我将 buffer[] 和 *lines[] 增加 1000000 个字节,它不会提供任何东西(如果我理解得很好,它会提供未定义的行为)。我需要使用 100.000 行可变长度行的文件来完成这项工作,

那么,我如何声明一个非常大的数组以便我可以传递每一行?因为,正如我所揭示的,它不适用于大文件。

感谢任何帮助!

最佳答案

char *lines[10000]; 只是一个指向行的指针数组,而不是要存储实际行的数组(内存)。

malloc 正在为每一行分配一 block 内存,您应该仅在使用完该 block 后才调用 free

如果您删除 free,您的解决方案将起作用,但您需要记住在其他时间点 free

关于C - 将非常大的文件中的行插入到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58831153/

相关文章:

java - 如何将 HashMap 放入数组中? conf[0] = new HashMap<String, Object>();

php - 连接两个数组的值

java - Java 中的 "reached end of file while parsing"是什么意思?

c++ - 如何禁用 Alt 键的正常行为?

使用 C 中的一些通用函数调用来调用多个函数

c - 结构体标签别名

c - 在 C 的 HashTable 中插入具有串联的方法

ruby - 填充数组并将哈希值转换为数组

c - 为什么在C中,读取文件时必须使用字符数组?

c - C中读取多个文件时"*** glibc detected *** ./a.out: realloc(): invalid next size:"