一.前言

在使用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++文件操作之缓冲区相关推荐

  1. Node 简介、模块、模板引擎、NPM、文件操作、缓冲区、文件流、网络操作、Express框架

    一.Node简介 1.1 客户端的JavaScript是怎样的 问题 答 什么是 JavaScript 脚本语言 运行在浏览器中 一般用来做客户端页面的交互(Interactive) JavaScri ...

  2. 一、C语言篇——10. 文件操作

    01. 文件打开和关闭 #include <stdio.h> FILE * fopen(const char * filename, const char * mode); 功能:打开文件 ...

  3. 【C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲区 | 缓冲区工作机制 )

    文章目录 一.C 语言中的文件操作函数 二.磁盘与内存缓冲区 三.缓冲区工作机制 一.C 语言中的文件操作函数 读取 文本文件 可以使用 getc , fgets , fscanf 函数 , 向 文本 ...

  4. 文件的输入和输出:流和缓冲区的概念和文件操作函数总结

    流和缓冲区的概念理解 流(stream) A stream is a source or destination of data that may be associated with a disk ...

  5. java 文件缓冲区_基于直接缓冲区和非直接缓冲区的javaIO文件操作

    基本概念: 1. 非直接缓冲区:  指的是通过jvm来缓存数据的,应用程序要读取本地数据要经历从本地磁盘到物理内存,然后copy到jvm中,然后再通过流的方式读取到应用程序中,写的操作正好与之相反. ...

  6. C语言文件操作——数据文件类型、文件判断、文件缓冲区详解

    之前,我讲解了文件操作的三大步骤,讲解了文件读写的各类函数和使用方法,今天,还是来和大家聊一聊文件操作剩余的一些知识点. 一.数据文件类型 之前我讲到过文件按照功能类型分为程序文件和数据文件两大类,我 ...

  7. C语言文件缓冲区作用,C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲...

    //文件结构体FILE的理解以及缓冲区再讲 #include #include //要点:文件结构 //struct _iobuf { // char *_ptr; ------当前缓冲区内容指针 / ...

  8. fread读取同一个文件得到缓冲区大小不同_c++日志文件操作

    @[toc] 一.源代码说明 本文介绍的是ccfree框架中日志文件操作的方法. 函数和类的声明文件是ccfree/_ccfree.h. 函数和类的定义文件是ccfree/_ccfree.cpp. ...

  9. python3 转码的函数_python基础3之文件操作、字符编码解码、函数介绍

    内容概要: 一.文件操作 二.字符编码解码 三.函数介绍 一.文件操作 文件操作流程: 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 基本操作: 1 #/usr/bin/e ...

  10. C++:文件操作2 文本文件和二进制文件的读写

    文件读写的步骤: 1.包含的头文件:#include <fstream>//使用文件流进行操作 2.创建流 3.打开文件(文件和流关联) 4.读写 (写操作:<<,put( ) ...

最新文章

  1. vs2008中,创建基于对话框的mfc动态库步骤
  2. 一文全览机器学习建模流程(Python代码)
  3. 结构体是否有默认的构造函数?(没有,如果需要,需要自己写)
  4. 突破三个自我,你就不光是老板的料
  5. 表单字段三维数组名_【技术汇】回转式空气预热器温度场三维数值模拟
  6. 斜齿轮啮合 matlab,渐开线斜齿轮曲面精确建模及MatLab仿真
  7. Laravel Passport里的授权类型介绍
  8. LeetCode 82. 删除排序链表中的重复元素 II(链表)
  9. mysql索引过多为什么会慢_mysql – 为什么索引使这个查询更慢?
  10. 变频电源启动不了的原因是什么
  11. 2013年计算机考试题库,2013年计算机三级数据库上机冲刺试题一及答案
  12. matlab无法显示图片
  13. dbv mysql_mysql数据库版本控制dbv使用
  14. Premiere Pro 中的键盘快捷键
  15. HTML网页设计教师评语,服装设计毕业设计指导教师评语
  16. 水果电商网站开发过程
  17. JVM垃圾回收——G1垃圾收集器
  18. 正则匹配将字符串除首位和末尾以外的字符显示为*
  19. 学习期间的感悟和个人写的一段歌词
  20. 短视频拍摄5大景别及11种运镜手法,新手必备拍摄干货丨国仁网络资讯

热门文章

  1. lvremove 删除逻辑卷
  2. abort has been called翻译_小分享:一款优秀的你还不知道的免费翻译工具推荐给大家...
  3. ajax 解析gzip,javascript – 如何让浏览器gunzip一个Ajax获取gziped文本文件?
  4. 唤醒屏幕_屏幕保护程序被困在Mac上?如何解决它
  5. c++ opengl 绘制地面_铝合金门窗设计之绘制节点图
  6. 公钥 私钥_比特币私钥、公钥、钱包地址之间的关系
  7. Ubunt_配置_tftp(文件传输)
  8. Python 中的 classmethod 和 staticmethod 有什么具体用途?
  9. CSS选择器之基本选择器总结
  10. php pdf文件上传,显示