首页 > 解决方案 > C - 读取文件并将文本放入具有动态内存分配的字符指针

问题描述

我正在尝试从我为 C 程序编写的外部文件中逐行读取基本着色器。在文件中有两个着色器:顶点和片段。我创建了这个函数来逐行读取它,并确定它正在读取哪个着色器并返回 struct ParsedShader

typedef struct {
char* vertex;
char* fragment;
} ParsedShader;

static ParsedShader ParseShader(char *filepath) {

    char* vert;
    char* frag;
    vert = "\n";
    frag = "\n";

    char line[128];

    enum ShaderType {
        NONE = -1,
        VERTEX = 0,
        FRAGMENT = 1
    };

    enum ShaderType type = NONE;

    FILE* file;
    fopen_s(&file, filepath, "r");

    while (fgets(line, sizeof(line), file)) {
        if (strstr(line, "#shader")) {

            if (strstr(line, "vertex")) type = VERTEX;

            else if (strstr(line, "fragment")) type = FRAGMENT;
        
        }
        else {

            if (type == VERTEX) {
            //Put Lines into vert char *
            //Here is where I don't know what to do
            }
            else if (type == FRAGMENT) {
            //Put Lines into frag char *
            //Here I don't know what to do either
            }

        }
    }

    fclose(file);

    ParsedShader result;
    result.vertex = vert;
    result.fragment = vert;

    return result;
}

问题是由于内存的原因,我无法将文本放入vertand变量中。frag我知道它必须使用mallocandrealloc函数来完成,但就是不能让它工作。我已经创建了一个释放内存的函数:

static DeleteShader(ParsedShader* shader) {
    if (shader) {
        free(shader->vertex);
        free(shader->fragment);
    }
}

标签: cfilememory-managementshaderline-by-line

解决方案


初始化:

vert = calloc(1, sizeof(char));

这将分配一个元素并将其初始化为零(字符串结尾)。

添加字符串:

vert = realloc(vert, strlen(vert) + strlen(line) + 1);
strcat(vert, line);

这将重新分配缓冲区以具有连接的字符串(包括字符串结束标记),然后连接字符串。

您可以为frag.

此代码无效,因为它会多次扫描字符串以测量其长度,但它应该适用于大小高达几 KB 的文件。

添加错误检查calloc并将realloc使代码更安全。


推荐阅读