c/c++文件操作之缓冲区
一.前言
在使用c/c++读取文件,写入文件是很常用的操作,在使用之余很少注意一些细节,比如文件流的缓冲区,系统内核系统空间与用户空间之间的交互操作等,此处来简单描述一下缓冲区
二.缓冲区
含义:内存中开辟的一片缓冲区域
缓冲类型:全缓冲,行缓冲,不带缓冲
操作方式:
可以通过标准库函数setvbuf来设置缓冲区的类型
setvbuf(_Inout_ FILE * _File, _Inout_updates_opt_z_(_Size) char * _Buf, _In_ int _Mode, _In_ size_t _Size);
参数:
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
- buffer -- 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
- mode -- 这指定了文件缓冲的模式:
模式 | 描述 |
---|---|
_IOFBF | 全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。 |
_IOLBF | 行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。 |
_IONBF | 无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。 |
- size --这是缓冲的大小,以字节为单位。
返回值
如果成功,则该函数返回 0,否则返回非零值。
三.实际使用
这里要简单说一下,我为什么会用到文件缓冲区以及,修改缓冲区的值,来满足自己的开发需求。
我在使用 FILE 读写文件时,打开了一个较大的文件大概50K左右的文本本件,如下:
FILE *fpOut=fopen(fileDir.c_str(),"w");
正常读写是没什么问题的,然而,在读取了该文件之后,我想要在内存中直接获取到读到的内容(转存为字符串),出于这种想法,我查看了 fpOut的成员 fpOut->_base与fpOut->_ptr,该内存区域存储的就是读入的文件内容,我就想着直接将该部分内容取出来使用,结果也是可以的,只限于小文件,可以正常使用(仅限于小文件大小小于fpOut->_bufsiz值4096,即一个页的大小,这个大小是默认的),当文件大于该缓冲区(fpOut->_bufsiz 4096),则直接从该内存处拿取的内容就不完整了,因为这个是临时缓冲区,当读入的内容满了之后就会清除,然后再读入新的内容,这样子就不能直接使用了,要想直接获取全部的内容则可以手动更改该缓冲区的大小,这就用到了上面的函数setvbuf(),缓冲区的模式,来提高读写效率(根据实际情况设置较大的缓冲区,减少调用内核操作),具体的操作可以测试每种模式的不同之处
#define FILE_BUFF_SIZE 102400
char buf[FILE_BUFF_SIZE];
setvbuf(fpOut,buf,_IOFBF,FILE_BUFF_SIZE);
四.扩展
函数fflush与setbuf函数的使用
参考:内存缓冲区解析 - lovejobs - 博客园
关于setvbuf()函数的详解_化茧成蝶007-CSDN博客
c/c++文件操作之缓冲区相关推荐
- Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架
一.Node简介 1.1 客户端的JavaScript是怎样的 问题 答 什么是 JavaScript 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScri ...
- 一、C语言篇——10. 文件操作
01. 文件打开和关闭 #include <stdio.h> FILE * fopen(const char * filename, const char * mode); 功能:打开文件 ...
- 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )
文章目录 一.C 语言中的文件操作函数 二.磁盘与内存缓冲区 三.缓冲区工作机制 一.C 语言中的文件操作函数 读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本 ...
- 文件的输入和输出:流和缓冲区的概念和文件操作函数总结
流和缓冲区的概念理解 流(stream) A stream is a source or destination of data that may be associated with a disk ...
- java 文件缓冲区_基于直接缓冲区和非直接缓冲区的javaIO文件操作
基本概念: 1. 非直接缓冲区: 指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反. ...
- C语言文件操作——数据文件类型、文件判断、文件缓冲区详解
之前,我讲解了文件操作的三大步骤,讲解了文件读写的各类函数和使用方法,今天,还是来和大家聊一聊文件操作剩余的一些知识点. 一.数据文件类型 之前我讲到过文件按照功能类型分为程序文件和数据文件两大类,我 ...
- C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...
//文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...
- fread读取同一个文件得到缓冲区大小不同_c++日志文件操作
@[toc] 一.源代码说明 本文介绍的是ccfree框架中日志文件操作的方法. 函数和类的声明文件是ccfree/_ccfree.h. 函数和类的定义文件是ccfree/_ccfree.cpp. ...
- python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍
内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...
- C++:文件操作2 文本文件和二进制文件的读写
文件读写的步骤: 1.包含的头文件:#include <fstream>//使用文件流进行操作 2.创建流 3.打开文件(文件和流关联) 4.读写 (写操作:<<,put( ) ...
最新文章
- vs2008中,创建基于对话框的mfc动态库步骤
- 一文全览机器学习建模流程(Python代码)
- 结构体是否有默认的构造函数?(没有,如果需要,需要自己写)
- 突破三个自我,你就不光是老板的料
- 表单字段三维数组名_【技术汇】回转式空气预热器温度场三维数值模拟
- 斜齿轮啮合 matlab,渐开线斜齿轮曲面精确建模及MatLab仿真
- Laravel Passport里的授权类型介绍
- LeetCode 82. 删除排序链表中的重复元素 II(链表)
- mysql索引过多为什么会慢_mysql – 为什么索引使这个查询更慢?
- 变频电源启动不了的原因是什么
- 2013年计算机考试题库,2013年计算机三级数据库上机冲刺试题一及答案
- matlab无法显示图片
- dbv mysql_mysql数据库版本控制dbv使用
- Premiere Pro 中的键盘快捷键
- HTML网页设计教师评语,服装设计毕业设计指导教师评语
- 水果电商网站开发过程
- JVM垃圾回收——G1垃圾收集器
- 正则匹配将字符串除首位和末尾以外的字符显示为*
- 学习期间的感悟和个人写的一段歌词
- 短视频拍摄5大景别及11种运镜手法,新手必备拍摄干货丨国仁网络资讯
热门文章
- lvremove 删除逻辑卷
- abort has been called翻译_小分享:一款优秀的你还不知道的免费翻译工具推荐给大家...
- ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
- 唤醒屏幕_屏幕保护程序被困在Mac上?如何解决它
- c++ opengl 绘制地面_铝合金门窗设计之绘制节点图
- 公钥 私钥_比特币私钥、公钥、钱包地址之间的关系
- Ubunt_配置_tftp(文件传输)
- Python 中的 classmethod 和 staticmethod 有什么具体用途?
- CSS选择器之基本选择器总结
- php pdf文件上传,显示