c - 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;
}
问题是由于内存的原因,我无法将文本放入vert
and变量中。frag
我知道它必须使用malloc
andrealloc
函数来完成,但就是不能让它工作。我已经创建了一个释放内存的函数:
static DeleteShader(ParsedShader* shader) {
if (shader) {
free(shader->vertex);
free(shader->fragment);
}
}
解决方案
初始化:
vert = calloc(1, sizeof(char));
这将分配一个元素并将其初始化为零(字符串结尾)。
添加字符串:
vert = realloc(vert, strlen(vert) + strlen(line) + 1);
strcat(vert, line);
这将重新分配缓冲区以具有连接的字符串(包括字符串结束标记),然后连接字符串。
您可以为frag
.
此代码无效,因为它会多次扫描字符串以测量其长度,但它应该适用于大小高达几 KB 的文件。
添加错误检查calloc
并将realloc
使代码更安全。
推荐阅读
- c++ - 尝试(稍微)概括 C++ 模板。关联容器 Key:Value Inversion
- c# - 我已经安装了 .net core 2.1.3 x86 和 .net core 2.1.0 并尝试过,但我无法运行我的项目
- angular - 如何在 ng-content angular 6 中包含内容
- html - 如何使 div 填充视口的宽度而不是其父级?
- html - 我需要哪个 CSS 将一段文本标记为突出显示?
- css - 是否可以仅将引导库用于“百里香”中没有页眉和页脚的内容?
- database - 如何在moodle数据库中进行手动更改?
- python - 为什么运行“setup.py test”会运行我的控制台脚本?
- node.js - 在成功/错误情况下都会触发回调函数
- html - Safari 的标题上未显示徽标和按钮