为了效率的考虑,不至于频繁调用系统函数和访问IO设备,MSVC CRT的fread采用缓冲设计.
C语言提供的关于缓冲的函数有:
fread的调用过程大概是:
fread -> fread_s(增加缓冲溢出保护, 加锁) -> _fread_nolock_s(循环读取,缓冲) -> _read(换行符转换) -> ReadFile(读取文件)
加注释的FILE结构如下:
核心函数_fread_nolock_s(循环读取,缓冲)如下:
其中,
代码中分了三种情况:
1) 缓冲区不为空
此时, 把缓冲区中的数据复制到传入的字符数组中.
2) 缓冲区为空, 需要读取的数据大于缓冲的尺寸
此时, 直接调用函数_fread把文件中的内容写到传入的字符数组中.
3) 缓冲区为空, 需要读取的数据不大于缓冲的尺寸
此时, 调用函数_fread读满缓冲区, 并再写缓冲区的一个字符到传入的字符数组中.
若未读满传入的字符数组, 循环执行上述1~3过程, 直到读满或读到文件末尾(EOF).