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

时间:2015-04-12 19:44:47

标签: c memory allocation

所以,我现在已经在StackOverflow上搜索了一段时间,但是没有一个半相关帖子是我的解决方案,所以我希望任何人都可以提供帮助:)

所以我想做的是转移.txt文件,其中包含以下内容:

1 5 8

2 4 6 9

5 7 

(每个例子)

所以,我想知道的是:

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

  2. 我必须分别阅读每一行并提取数字,然后与ID相对应的结构内容进行比较。

  3. 如果我将.txt的内容传输到数组(使用malloc),它是否还有' \ n'在数组上,我可以区分线条吗?

1 个答案:

答案 0 :(得分:0)

由于值从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;
 }