从磁盘加载文件,加载一些额外的字符

时间:2017-06-01 18:19:53

标签: c opengl file-io

该程序接收一个指向const char *数据类型的指针,将一个文本文件从磁盘加载到内存中,并将结果char []的第一个索引的地址传回(实际上将文件的内容传递回一个'字符串')。

这很好用,但有时会使用文件内容传回一些额外的字符。

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

char* loadShaders(char* PATH) {

    FILE *fp = fopen(PATH, "rb");

    if (fp == NULL) {
        perror("[ctb.h] loadShaders() ");
        printf("[ctb.h] loadShaders() recieved file path: %s\n", PATH);
        exit(-1);
    }

    fseek(fp, 0, SEEK_END);
    long fsize = ftell(fp);
    rewind(fp);

    char* shader = malloc(fsize + 1);
    fread(shader, fsize, 1, fp);
    shader[fsize + 1] = '\0';
    fclose(fp);

    return shader;
}

当它确实传回多余的字符时,结果如下所示:

#version 330 core

layout (location = 0) in vec3 aPos;

void main() {
    gl_Position = vec4(aPos, 1.0);
}�

正如您可能已经猜到的那样,&#34;�&#34;不属于。

建议?

1 个答案:

答案 0 :(得分:3)

此行通过注销数组的结尾导致未定义的行为:

shader[fsize + 1] = '\0';

易于修复:

shader[fsize] = '\0';