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内容进行了缓存,但只返回一个字节给调用者。