一, fread, fwrite 与read, write的区别: 缓冲
- fread/fwrite是对 read, write的一层封装, 即加了一个缓冲区, 其目的在于尽量减少read/write的调用次数
- 缓冲区分类:
- 全缓冲: 就是缓冲区满才flush
- 行缓冲: 一行一次flush
- 无缓冲
- 特点:
- 会有一个例程自动地进行周期性的flush
- 一般来说标准输出, 标准输入是行缓冲的, 标准错误无缓冲, 普通磁盘文件是全缓冲
- 缓冲会造成一次额外的内存拷贝, 即由 内核–>用户 变成了 内核–>缓冲区–>用户, 但同时缓冲可以将多次琐碎的读写操作适当减少, 所以结论是: 如果能控制好每次read/write的大小(一般最合适的是pagesize), 直接用read/write效率最高
二, 其他函数
- freopen 重新打开一个FILE*
- fdopen: 根据fd创建一个FILE*
- flush: 刷新缓冲区
- fileno: 取一个FILE*的fd'
- fclose: 关闭FILE
- getc, fgetc, get_char: 每次读字符
- fgets, gets, 每次读一行字符
- ugetc: 将一个字符重新塞回FILE流中
- ferror, feof: fget等函数的返回值不区分读到eof还是error, 因此需要用这两个函数来区分
- ftell 返回当前offset
- fseek 移动offset
- rewind 将文件offset移到初始
- dprintf: pringtf的文件描述符版本
- tmpname: 生成一个合法的临时文件名, 一般为 /tmp/XXX
- fmemopen: 打开一段内存流, 即将内存封装成FILE*, 在需要分行读入时比较方便