将.txt文件传输到malloc分配的动态内存

将.txt文件传输到malloc分配的动态内存,c,memory,allocation,C,Memory,Allocation,所以,我已经在StackOverflow上搜索了一段时间,但是没有一篇半相关的文章可以解决我的问题,所以我希望任何人都能帮我:) 所以我想做的是传输一个.txt文件,上面有以下内容: 1 5 8 2 4 6 9 5 7 (每个示例) 所以,我想知道的是: 如何使用malloc将.txt传输到分配的内存 我必须分别读取每一行并提取数字,然后将ID为的结构的内容与.txt文件中的数字进行比较 如果我将.txt的内容传输到数组中(使用malloc),数组中是否仍有“\n”,以便我可以区分行 由

所以,我已经在StackOverflow上搜索了一段时间,但是没有一篇半相关的文章可以解决我的问题,所以我希望任何人都能帮我:)

所以我想做的是传输一个.txt文件,上面有以下内容:

1 5 8

2 4 6 9

5 7 
(每个示例)

所以,我想知道的是:

  • 如何使用malloc将.txt传输到分配的内存

  • 我必须分别读取每一行并提取数字,然后将ID为的结构的内容与.txt文件中的数字进行比较

  • 如果我将.txt的内容传输到数组中(使用malloc),数组中是否仍有“\n”,以便我可以区分行


  • 由于值从
    1
    9
    ,您可以使用
    0
    作为每行的哨兵,这样您就不需要预测或存储每行中的数字数量,您只需存储出现的所有数字,并在末尾添加一个
    0
    ,这将帮助您知道数字的结尾,与c处理字符串的方式相同

    下面的代码就是我描述的

    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    
    int
    appendvalue(int ***values, int row, int column, int value)
     {
        void *pointer;
    
        pointer = realloc(values[0][row], (1 + column) * sizeof(int));
        if (pointer == NULL)
         {
            fprintf(stderr, "warning: allocating memory\n");
            return 0;
         }
        values[0][row]         = pointer;
        values[0][row][column] = value;
    
        return 1 + column;
     }
    
    int
    main(void)
     {
        FILE  *file;
        char   buffer[100];
        char  *line;
        int  **values;
        int    row;
    
        file = fopen("input.txt", "r");
        if (file == NULL)
         {
            fprintf(stderr, "error opening the file\n");
            return -1;
         }
        values    = NULL;
        row = 0;
        while ((line = fgets(buffer, sizeof(buffer), file)) != NULL)
         {
            void  *pointer;
            size_t column;
    
            while (isspace(*line) != 0)
                line++;
            if (*line == '\0') /* empty line -- skip */
                continue;
            pointer = realloc(values, (row + 1) * sizeof(int *));
            if (pointer == NULL)
             {
                fprintf(stderr, "error allocating memory\n");
                return -1;
             }
            values      = pointer;
            values[row] = NULL;
            column      = 0;
            while ((*line != '\0') && (*line != '\n'))
             {
                if (isspace(*line) == 0)
                    column = appendvalue(&values, row, column, *line - '0');
                ++line;
             }
            column = appendvalue(&values, row, column, 0);
    
            row += 1;
         }
        /* let's print each row to check */
        for (--row ; row >= 0 ; --row)
         {
            size_t index;
            for (index = 0 ; values[row][index] != 0 ; ++index)
             {
                printf("%d, ", values[row][index]);
             }
            printf("\n");
            free(values[row]);
         }
        free(values);
        return 0;
     }
    
    #包括
    #包括
    #包括
    int
    appendvalue(int***值、int行、int列、int值)
    {
    void*指针;
    指针=realloc(值[0][row],(1+列)*sizeof(int));
    if(指针==NULL)
    {
    fprintf(stderr,“警告:正在分配内存”);
    返回0;
    }
    值[0][行]=指针;
    值[0][行][列]=值;
    返回1+列;
    }
    int
    主(空)
    {
    文件*文件;
    字符缓冲区[100];
    字符*行;
    整数**值;
    int行;
    file=fopen(“input.txt”,“r”);
    if(file==NULL)
    {
    fprintf(stderr,“打开文件时出错”);
    返回-1;
    }
    值=空;
    行=0;
    而((line=fgets(buffer,sizeof(buffer),file))!=NULL)
    {
    void*指针;
    柱体尺寸;
    而(isspace(*行)!=0)
    line++;
    如果(*line=='\0')/*空行--跳过*/
    持续
    指针=realloc(值,(行+1)*sizeof(int*);
    if(指针==NULL)
    {
    fprintf(stderr,“分配内存时出错”);
    返回-1;
    }
    值=指针;
    值[行]=空;
    列=0;
    而((*line!='\0')&&(*line!='\n'))
    {
    如果(isspace(*行)==0)
    column=appendvalue(&values,行,列,*行-'0');
    ++线路;
    }
    column=appendvalue(&values,行,列,0);
    行+=1;
    }
    /*让我们打印每一行以进行检查*/
    对于(--row;row>=0;--row)
    {
    尺寸指数;
    对于(索引=0;值[行][索引]!=0;++索引)
    {
    printf(“%d”),值[行][索引];
    }
    printf(“\n”);
    自由(值[行]);
    }
    自由(价值观);
    返回0;
    }
    
    显然,
    fgets()
    +
    strtol()
    组合将非常适合此任务。文件是否像示例中那样不规则?我的意思是,每一行包含不同数量的值?我想要每一行的分离值,例如:1,5和8,对于第1行,strtol会在字符串上放置158吗?因为如果是这样的话,那会有帮助的。但是我怎么才能转到下一行呢?顺便说一下,谢谢,是的。带有值的文件是随机生成的,每行至少有2个值,我可以保证记录中不会有超过9的值。什么?你是说每一行都是一个数字?数字之间用空格隔开?不,第1行有三个数字:1、5和8。我需要把它们分开。但是,如果strtol将值158放在一个字符串上,我可以单独得到数字。你能说一下预期的文件大小吗?问题是,我不能更改生成文件的代码,所以我不能将0放在行结束的地方。
    0
    将放在读取文件的代码中,即上面的代码,它被放置在您分配的堆空间中,您可以使用
    realloc()
    测试代码,告诉我它是否符合您的需要,尝试理解打印数字的部分,Y asívas a entender bien como usar el arreglo
    value
    。哦,我明白了,我要尝试一下,我会告诉您一些事情,非常感谢您的时间,耐心和知识:]你能解释一下你在代码的最后部分做了什么吗?我以为你把所有的值都放到了一个矩阵中,但我有点困惑,特别是在变量“index”部分。这些值在一个有[row]行的矩阵中,但我不太了解索引部分,抱歉:c,我还是新手c@DanielFernandes它不是一个矩阵,它是一种不同类型的容器,最后一部分是容器的“行”,但每一行都有不同数量的项目,所以你扫描项目直到
    项目[索引]==0
    条件满足,因为这意味着没有更多的项目。