使用stat()确定fread()的大小

时间:2018-12-03 23:57:50

标签: c fread stat

使用fread()时,我的文件未读到末尾,并且从stat()返回了文件大小。

我检查过的手册:

  

http://man7.org/linux/man-pages/man2/stat.2.html

     

http://man7.org/linux/man-pages/man3/fread.3.html

这是我的代码:

FILE *file = fopen(path, "r");
if (file == NULL) {
    printf("failed!\n");
    return 0;
}

struct stat fileattribs;
size_t size;    

if (stat(path, &fileattribs) < 0)
    return 0;

size = fileattribs.st_size;

char *buff = (char *) malloc(sizeof(char) * (size + 1));
fread(buff, sizeof(char), size, file);
buff[size] = '\0';

这是我要读取的文件:

#version 330 core

out vec4 light_fragment_color;

uniform vec3 object_color;
uniform vec3 light_color;

void main(void) {
    light_fragment_color = vec4(light_color * object_color, 1.0);
} 

如果我在上面的代码中将size变量(例如,增加了5),则读取成功,但是发生了段错误(是的,这是一个愚蠢的主意...)。

如何使用stat()和fread()函数正确读取文件?

1 个答案:

答案 0 :(得分:1)

只有一个想法:也许您的文件实际上被读到末尾,您只是看不到它。因为如果您的文件包含二进制零,则此一个将用作字符串终止符,而不是您的一个。 (因为缓冲区中的第一个二进制零总是标记字符串的结尾。)