关于setvbuf()函数的详解
来源:互联网 发布:网络实体店怎么开 编辑:程序博客网 时间:2024/06/05 06:07
为什么要使用setvbuf函数
如果你的内存足够大,可以把文件IO的BUF设置大一些,这样每次你用fopen/fread/fwrite/fscanf/fprintf语句的时候,都会在内存里操作,减少内存到磁盘IO读写的操作次数,提高系统效率。
如果你的程序的功能涉及到类似数据库、视频、音频、图像处理等大量需要爆发式磁盘到内存的IO情况下,可以考虑用setvbuf进行优化内存IO,其他情况下可以不考虑,LINUX/WINDOWS会自动处理这些问题。
功 能: 把缓冲区与流相关
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
参数:stream :指向流的指针 ;
buf : 期望缓冲区的地址;
type : 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size : 缓冲区内字节的数量。
if (setvbuf(input, bufr, _IOFBF, 512) != 0)
是设置 input这个文件流使用 bufr 所指的512个字节作为 input文件的buffer, 当你操作input文件时,数据都会暂存在 bufr 里面,每次读input时,系统会一次性读512字节到bufr里暂存。
if (setvbuf(output, NULL, _IOLBF, 132) != 0)
是设置output文件的buffer,这个buffer会由系统自行调用malloc来申请,buffer是按行模式工作的,每行最大132个字节,也就是当你写output的时候,每写完一行(遇见\n),就会把整行真正的写到磁盘文件上,在遇到换行符前,都咱存在系统自动申请的buffer中,而不会写到真正的磁盘文件上。
案例
#include <stdio.h>
int
main()
{
FILE
*input, *output;
char
bufr[512];
input =
fopen
(
"file.in"
,
"r+b"
);
output =
fopen
(
"file.out"
,
"w"
);
/* set up input stream for minimal disk access,
using our own character buffer */
if
(
setvbuf
(input, bufr, _IOFBF, 512) != 0)
printf
(
"failed to set up buffer for input file\n"
);
else
printf
(
"buffer set up for input file\n"
);
/* set up output stream for line buffering using space that
will be obtained through an indirect call to malloc */
if
(
setvbuf
(output, NULL, _IOLBF, 132) != 0)
printf
(
"failed to set up buffer for output file\n"
);
else
printf
(
"buffer set up for output file\n"
);
/* perform file I/O here */
/* close files */
fclose
(input);
fclose
(output);
return
0;
}
阅读全文
0 0
- 关于setvbuf()函数的详解
- 关于setvbuf()函数的详解
- setvbuf () 函数
- setbuf setvbuf函数的理解(转)
- setvbuf()创建缓冲区函数
- C语言的setvbuf函数:设置文件流的缓冲区
- C语言setvbuf()函数:设置文件流的缓冲区
- setvbuf的使用
- setvbuf
- setvbuf
- setvbuf
- setvbuf()
- setvbuf
- setvbuf
- setvbuf()
- setvbuf()
- libevent学习笔记--setvbuf()函数
- setbuf和setvbuf两函数学习记录
- 编写简单的连接MongoDB数据库C++程序 && 解决编译C++程序时链接MongoDB动态库失败的问题
- 分布式dubbo + zookeeper
- BAT内部级别与薪资待遇
- c++入门教程(十六)
- linux tar命令的使用
- 关于setvbuf()函数的详解
- 【iOS】RxSwift入坑感想及建议
- C++多线程——AfxBeginThread
- JSON.stringify()和JSON.parse()
- maven使用exec插件运行Java main方法,以下是3种不同的操作方式。
- 提交文件到远程仓库git
- 【福利来了】rbd image qos
- 第五章 UVA
- HDU6178-Monkeys