是否可以在C语言中使用malloc从文件中获取一个token并创建一个结构?

问题描述 投票:0回答:1

我需要同时使用 mallocrealloc 并对如何操作感到困惑。

假设输入文件是这样的。

a *b c
a
*a b *c

而且我把结构设置成了这样

typedef struct Unit {
    bool hasAstericks;
    char letter;
} unit;

typedef struct Line {
    struct unit clause[4]
} line;

是否可以创建一个类型为 unit 将每一个字母加到结构体中的一个数组中。Line 基于它们所在的线?我试过使用循环,但无法在飞行中使用它们创建结构。

这是我试过的。

int c;
filename = argv[1];
char *filename;
FILE *fp = fopen(filename, "r");  
filename = (char *)malloc(size);

do {
    c = fgetc(fp);
    inputFile = (char *)realloc(inputFile, size + 1);
    inputFile[n] = c;
    n++;
    size++;
} while (c != EOF);
c struct malloc token dynamic-memory-allocation
1个回答
2
投票

您的 do while 循环试图将文件读入一个由以下内容组成的数组中 char 每从文件中读取一个额外的字节就重新分配一个字节。

然而,你应该测试文件结束时的 之前 将字节存储到数组中。

另外,最好是在数组结束时设置一个null终止符,所以数组应该有一个 size + 1 字节。

这里将你的代码修改并封装在一个函数中读取文件。

char *read_file(const char *filename) {
    FILE *fp = fopen(filename, "r");  
    if (fp == NULL)
        return NULL;
    size_t size = 0;
    char *p = malloc(size + 1);
    if (p != NULL) {
        int c;
        while ((c = getc(fp)) != EOF) {   
            char *newp = realloc(p, size + 2);
            if (newp == NULL) {
                free(p);
                p = NULL;
                break;
            }
            p = newp;
            p[size] = c;
            size++;
        }
        if (p) {
            p[size] = '\0';  set a null terminator: make p a C string.
        }
    }
    fclose(fp);
    return p;
}
© www.soinside.com 2019 - 2024. All rights reserved.