您的位置:首页 > 其它

fread和read的区别,验证fread是带缓存的

2015-11-10 21:26 316 查看
fread是c标准库函数(调用read),read是unix系统下的系统调用;fread是带缓存的,read是不带缓存的;

验证如下:

采用fread一个一个字节读取文件,gdb查看什么时候调用read读取磁盘?

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

int main()
{
        FILE *file_error = fopen("50M_tvgw-1.ts", "rb");
        if (NULL == file_error)
        {
                printf("fopen error:%d:%s\n", errno, strerror(errno));
                return -1;
        }
        char file_ebuf[188] = {0};
        int j = 0;

        while (0 != fread(file_ebuf, 1, 1, file_error))
        {
                j++;
                printf("j=%d\n", j);
        }
        return 0;
}


fread第二次调用read时的断点情况:

j=4093
j=4094
j=4095
j=4096

Breakpoint 1, 0x0000003f71ada350 in read () from /lib64/libc.so.6
(gdb) bt
#0  0x0000003f71ada350 in read () from /lib64/libc.so.6
#1  0x0000003f71a711e8 in _IO_new_file_underflow () from /lib64/libc.so.6
#2  0x0000003f71a70b88 in _IO_file_xsgetn_internal () from /lib64/libc.so.6
#3  0x0000003f71a66a72 in fread () from /lib64/libc.so.6
#4  0x00000000004006bd in main () at fread_test.c:16


以上验证可以看出fread是带缓存的,第一次调用read系统函数读取了4KB内容进行了缓存,但只返回一个字节给调用者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: