2017-06-01 92 views
0

该程序收到一个指向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); 
}� 

正如你可能已经猜到了,“”不属于。

对此提出建议?

+0

你不意味着:'着色器[FSIZE] =“\ 0 “;'? –

回答

3

这条线通过注销阵列的端部导致未定义的行为:

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

简单修复:

shader[fsize] = '\0';