当我使用此代码时
FILE *f = fopen(file, "rb");
const char *d;
if (f!=NULL) {
static char c[100000];
fread(c, sizeof(char), 10000000, f);
d = c;
fclose(f);
return d;
}
else{
/*
char *ff = f;
perror(ff);
*/
d = "Error";
fclose(f);
return d;
}
从具有此类文本的文件中读取
This
Is a test
它读得很好。但是,如果我打开一个具有此文本的其他文件
Test
它会读取类似
的内容Test Is a test
为什么文件关闭时两者合二为一? 我现在就把它,但我仍然得到相同的结果
if (f!=NULL) {
fread(c, sizeof(c), len, f);
d = c;
fclose(f);
c[99999] = '\0';
return d;
}
答案 0 :(得分:4)
fread()
没有NUL终止它读取的缓冲区。如果第二次读取比第一次读取短,则第一次读取的其余部分将保留在那里。无论如何,你的程序在很多地方调用未定义的行为,甚至都不好笑。
例如,这个:
static char c[100000];
fread(c, sizeof(char), 10000000, f);
很可能是一个错字 - 你允许fread()
读取的数据量是缓冲区大小的100倍。这就是为什么你 总是 (我的意思是, 总是 )使用sizeof()
运算符和大小数组元素而不是其类型。此外,sizeof(char)
始终为1,不要拼出冗余数据:
fread(c, sizeof(c), 1, f);
答案 1 :(得分:4)
看起来上次读取时数组中还剩下字符。你应该在返回之前使字符串终止,fread()
不会为你做这件事。
您还有其他一些问题,例如fread()
的字符数限制大于缓冲区大小。
除非你真的需要c,否则你应该考虑使用c ++甚至其他语言和更复杂的文件和文本处理库,它会让你的生活更轻松。
答案 2 :(得分:2)
您正在将数据读入静态缓冲区,并且在完成后不会终止该字符串。
由于c
是静态的,因此初始化为零。您使用fread()
调用中的数据部分覆盖了该内容。
因此,您应该使用fread()
中返回的值并将c[len]
设置为'\0'
。