fread()从当前文件和旧文件中读取

时间:2013-03-18 21:57:12

标签: c text fread

当我使用此代码时

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;
}

3 个答案:

答案 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'