C-fread至多能读4096字节?

前端开发 前端开发 主题:1148 回复:2395

C-fread至多能读4096字节?

归属感 发布于 2017-05-05 字数 422 浏览 1347 回复 6

用"r"读二进制文件的时候出现了一个奇怪现象,后面有数据却读不出来了
~是缓冲区的原因么?貌似又不是啊

int buff[2000];
FILE* fs = fopen("teeee.st", "r"); // 文件足够大
size_t p = ftell(fs); // p == 0

fread(buff, sizeof(int), 1500, fs);
p = ftell(fs); // p == 4096

fread(buff, sizeof(int), 1500, fs);
p = ftell(fs); // p == 8192

fclose(fs);

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(6

归属感 2017-10-26 6 楼

FILE* fs = fopen("teeee.st", "rb"); // 文件足够大

清晨说ぺ晚安 2017-10-19 5 楼

你要以 b 的方式打开二进制文件吧,以文本方式会让一些字符变成ascii的控制字符,这样就影响缓冲区了。

浮生未歇 2017-09-16 4 楼

fread(buff, sizeof(int), 1500, fs);
用法有误 1500代表的应该是1500*4 = 6000字节数
如果没读到这么多 也许文件已经结尾

或者文件中有EOF结束符

建议 检查下文件的字节数

或者换个文件试试

清晨说ぺ晚安 2017-08-12 3 楼

在区分二进制文件的系统上,这个用法是有问题的,windows中是区分文本文件和二进制文件的,fread默认的是以文本文件方式打开,所以如果是文本文件fread在遇到的情况下,函数默认就认为到了文件的末位,不忘下读取数据,这可你可以查看linux的fread函数的源代码

else {
/* less than bufsize chars to read, so call _filbuf to
 fill buffer */
if ((c = _filbuf(stream)) == EOF) {
    /* error or eof, stream flags set by _filbuf */
    return (total - count) / size;
}

/ _filbuf returned a char -- store it / *data++ = (char) c; --count;

代码中有这么一段,所以如果确定是二进制文件,则一定要用二进制的方式打开读取。

偏爱自由 2017-07-28 2 楼

你最好弄明白fread参数及返回值的意思,文件大的话,你可以进行循环的读。一次读取文件内容较多的时候,在本地不会出问题,如果是网络的socket那么就会出现隐患。

泛泛之交 2017-06-06 1 楼

问题可能出在你的fread函数中,fread函数从输入流中最多读取具有指定长度的count个(你这里就是1500)元素到指定的数组。因为你指定了长度,所以也就是到了文件尾,当然也可能是出现了错误,你最好使用feof或ferror函数判断是出现了错误还是到了文件尾。