关于C++流的缓冲区的讨论

2023-05-16

现在来讨论一下关于C++的输入输出流的缓冲区问题

一般 C++ 我们使用输出流cout都会用到endl这个操纵符。是吧

C++里有几个可以来控制缓冲区刷新的操纵符。

  • endl
  • flush
  • ends
  • unitbuf
  • nounitbuf 

这几个操纵符是用来控制输出流的缓冲区,这里主要要讲一下这几个的作用。

先来介绍一下这几个的作用:

endl // endl是用来 完成换行并刷新缓冲区的

flush // flush是用来 直接刷新缓冲区的

ends // ends 则在输入后加上一个空字符,然后再刷新缓冲区

cout << unitbuf // 这里unitbuf 不执行任何动作,而是设置这个cout输出流 在接下来的每次操作之后都进行刷新缓冲区

cout << nounitbuf // 这里nounitbuf则是让cout 回到正常的缓冲方式

介绍完了我们个个来试一下

cout << "hhhh" << endl; //输出一个字符串 然后 再换行 刷新缓冲区

cout << "hhhh" << flush; //输出一个字符串 然后 直接刷新缓冲区

cout << "hhhh" << ends; //输出一个字符串 和一个空字符 然后刷新缓冲区

cout << unitbuf; // 这样的话 设置 cout 接下来的操作都进行一次刷新缓冲区
cout << "hhh";  // 这里会刷新缓冲区

cout << nounitbuf; //这里则让cout回到正常的缓冲方式

这样都执行完了 ,都会在控制台上输出,单是这样输出 大家应该没有什么感受把 都是直接再控制台输出 都会出现字符串

下面我们用 文件流 来演示的刷新缓冲区的作用

ifstream 文件输入流类型

ofstream 文件输出流类型

这里我们用到ofstream 类型来创建一个文件流对象。

下面正式演示各个操纵符的作用来刷新缓冲区。

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
	ofstream out_file("test.txt", ofstream::trunc); //这里创建一个文件用来输出写入,以trunc的方式打开,每次打开都会清空文件里的数据

	for (size_t i = 0; i != 5; ++i)
	{
		string t;
		cin >> t;
		out_file << t; //这里并没有设置什么操纵符来刷新缓冲区
	}

	return 0;
}


下面是我们试着来输入字符串,然后写入到文件流里。

我们输入一个字符串 并回车 再看看文本里的数据

程序并没有真正的写入到文件里,下面我们用到操纵符来看

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main()
{
	ofstream out_file("test.txt", ofstream::trunc); //这里创建一个文件用来输出写入,以trunc的方式打开,每次打开都会清空文件里的数据
	
	for (int i = 0; i != 5; ++i)
	{
		string t;
		cin >> t;
		out_file << t << endl; //这里用到endl 换行并且刷新存入缓冲区里的数据 真正的写入
	}

	return 0;
}


用到endl 下面来运行程序

输入两个字符串 ,然后看看文本

也已经真正的写入到文件里了,字符串写入然后并且换行,这里就是刷新缓冲区的数据真正写入到文本里来。

这里就已经说明如果没有刷新缓冲区的话,数据是一直再缓冲区里的,而要利用操纵符来刷新缓冲区,真正的写入到文件里

下面还有其他的 直接贴上图片!让大家看下

flush

out_file << t << flush;

flush 刷新缓冲区 没有换行 文本就显示一行

请先跳过ends!!

// ends

out_file << t << ends;


//ends 好像也没什么问题,嗯,没问题,所谓的输出再加上空字符也就是 一个空格

然后是 unitbuf 

out_file << unitbuf; //这里先把cout设置成 接下来 每次输出的进行刷新缓冲区
 //然后再在相同的程序里 输入5 次
for (int i = 0; i != 5; ++i)
{
	string t;
	cin >> t;
	out_file << t;
}


是可以的,先设置缓冲方式,然后接下来都会刷新缓冲区,文本排成一行。

nounitbuf

out_file << nounitbuf; //回到正常的缓冲方式,也就是不立即清空缓冲区

以上,就讲解完了

下面来说一下  关联输入和输出流

C++ 标准库  提供可以把 一个istream 对象 关联到一个 ostream, 也可以把 一个ostream 关联到 另一个 ostream

提供了一个 成员函数 stream.tie

标准库把cin和cout关联在一起,关联 也就是 当一个输入流被关联到一个输出流时,任何 从输入等待 的读取数据时,都会先刷新被关联的那个 输出流。

tie 有两个重载的版本,一个版本不带参数,返回指向输出流的指针。如果本对象当前关联到一个输出流,则返回的就是指向这个流的指针,如果对象未关联到流,则返回空指针

tie的第二个版本接受一个指向ostream的指针,将自己管理啊难道次ostream,即,stream.tie(&stream) 将流关联到另一个输出流stream。

cin.tie(&cout);    //这样也就关联在一起

每次cin读取数据的时候,就会刷新cout的缓冲区。

cin.tie(nullptr);    //不关联任何流

这样就取消关联了

最后再总结一下缓冲区

1.什么是缓冲区
缓冲区又称缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,着写储存空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

缓冲区根据其对应的是输入设备还是输出谁被,分为输入缓冲区和输出缓冲区。

2.计算机中的缓冲区

缓冲器为暂时置放输出或输入资料的内存。

缓冲期内资料自储存设备(如硬盘)来,放置在缓冲器中,待待机送至cpu或其他运算设备。

缓冲区(buffer)这个中文译意院子当计算机的高速部件与低速不见通讯时,必须将告诉不见的输出暂存到某处,以保证高速部件与低速部件相吻合,后来这个意思被扩展了,称为“临时存贮区”的意思。

缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和告诉的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放处CPU,使其能够高效率工作。


3.缓冲区的类型


缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。

1)全缓冲
在这种请款下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的地啊行代表时对磁盘文件的读写。
2)行缓冲
在这种情况下,当在输入和输出遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表时键盘输入数据。
3)不带缓冲
也就是不净行缓冲,标准出错情况stderr时典型代表,这使得出错信息可以直接尽快地显示出来。

4.缓冲区地刷新
下列情况会引发缓冲区地刷新:

缓冲区满师;
执行flush语句;
执行endl语句;
关闭文件;

可见,缓冲区满或关闭文件时都会刷新缓冲区,进行真正地I/O操作。
C++中,我们可以使用flush函数来刷新缓冲区(执行I/O操作并清空缓冲区)


windows 系统 的 的全缓冲区的大小是4096个字节,也就是输入到4096字节就不能再输入了
清空缓冲区。
在缓冲区满了之后,缓冲区会刷新缓冲区,执行真正的I/O操作。




cerr << "error" ; 这样则是无缓冲 立即执行I/O操作。

上面有些是照搬 不要介意,好了,现在就到这里,之后看 在做修改

有什么问题的请及时联系我哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C++流的缓冲区的讨论 的相关文章

  • Git删除已经存的tag

    git tag d tag name 删除本地tag git push origin refs tags tagname 删除远程tag 注意 xff1a refs 之间没有空格
  • EGL在PC和移动端上的支持共享上下文环境情况

    PC端 xff1a 不支持共享上下文 移动端 xff1a 支持共享上下文
  • Unity接入 百度语音识别 SDK

    接入百度语音识别 跟之前文章写过的接入讯飞语音识别一样 xff0c 都要去官网下载对应的SDK 所以我们去官网下载SDK xff0c 大家都是聪明人 百度语音SDK获取网址 怎样获取SDK部分就不做过多介绍了 xff0c 进入官网按照介绍
  • 常见排序算法的最好、最坏、平均时间复杂度以及空间复杂度

    文章目录 思考前言如何分析一个排序算法 xff1f 排序算法的执行效率排序算法的内存消耗排序算法的稳定性 如何选择合适的排序算法 xff1f 如何优化快速排序 xff1f 解答思考题参考链接 思考 为什么插入排序比冒泡排序更受欢迎 xff1
  • Unity 使用 Microphone 采集麦克风声音

    1 获取麦克风 xff0c Microphone devices 2 开始录音 xff0c Microphone Start 3 结束录音 xff0c Microphone End 1 MicrophoneWrapper 1 2 3 4 5
  • VR体验设计怎样做最有效?你需要知道这10点

    技术行业一直在努力简化与数字产品的交互过程 xff0c 在不远的将来 xff0c 我们将拥有自然逼真的用户界面 届时交互界面与我们现实发生的行为一致 虚拟现实技术 xff08 VR xff09 更加速了这一局面的到来 谷歌 Facebook
  • unity c# 录音并保存为 mp3 或 wav 文件

    private int Frequency 61 16000 录音频率 private int BitRate 61 16 比特率 private int MicSecond 61 2 每隔2秒 xff0c 保存一下录音数据 public
  • Unity c# Application类 文件路径

    Application dataPath Assets资源文件夹的绝对路径 Application persistentDataPath 持久性的数据存储路径 xff0c 在不同平台路径不同 xff0c 但都存在 xff0c 绝对路径 Ap
  • c++ 图像RGB24旋转90度和YUV420旋转90度

    逆时针旋转90度 void RGBRotate90 anticlockwise BYTE des BYTE src int width int height if des src return int n 61 0 int linesize
  • ubuntu x86搭建 麒麟arm QT6交叉编译

    ubuntu搭建QT6交叉编译 使用QT6搭建arm交叉编译平台 编译环境准备 交叉编译器 qt源码准备 开始编译QT 使用QT6搭建arm交叉编译平台 近期项目需求开发平台是unbuntu x86 目标机器是UOS arm架构 由于需要在
  • java分解质因数

    一个数的因数就是能与别的数相乘得到这个数的数 比如30 xff0c 它的因数就是1 xff0c 2 xff0c 3 xff0c 5 xff0c 6 xff0c 10 xff0c 15 xff0c 30 质因数 xff0c 首先 xff0c
  • Mac上pip/pip3设置国内源

    pip3 config set global index url https pypi tuna tsinghua edu cn simple
  • WSL基本使用配置

    前提 相信很多同学已经体验了wsl的强大 能让win电脑上少装一个虚拟机软件 xff0c 但是原生的wsl操作窗口复制粘贴很不方便 xff0c 对于使用习惯ssh的人来说用原生的确实有些难受 xff0c 故需要配置下使用ssh进行连接操作
  • 创建ECS服务器

    阿里云服务器 作业一 xff1a ECS之初体验 xff08 Linux xff09 任务一 xff1a 创建弹性云服务器 任务二 xff1a 登录云服务器 分别使用vnc Workbench和xshell登录云服务器 任务三 xff1a
  • Python报错:ModuleNotFoundError: No module named ‘xxx‘可能的解决方案大全

    Python报错 xff1a 34 ModuleNotFoundError No module named 39 xxx 39 34 这个报错是个非常常见的报错 xff0c 几乎每个python程序员都遇到过 xff0c 导致这个报错的原因
  • 反证法证明:为什么KMP算法不会跳过(漏掉)正确的答案

    KMP算法用于在母串中查找子串的出现位置 KMP算法 xff1a 字符串匹配问题 有详细的引入过程 xff0c 很容易理解掌握 首先我们都知道 xff0c KMP算法的next数组可以指导匹配失败情况下 xff0c 子串 xff08 模式串
  • 详解介绍Selenium常用API的使用--Java语言(完整版)

    参考 xff1a http www testclass net selenium java 一共分为二十个部分 xff1a 环境安装之Java 环境安装之IntelliJ IDEA 环境安装之selenium selenium3浏览器驱动
  • 华为OD2023机试真题【字符串重新排序】

    华为OD2023机试真题 全题库点这里 题目名称 字符串重新排序 知识点 排序数组 时间限制 1s 空间限制 256M 题目描述 给定一个字符串s s包含以空格分隔的若干单词 请对s进行如下处理后输出 span class token nu
  • 解决WSL2中Vmmem内存占用过大问题

    一 问题描述 在 Windows 系统中 xff0c 感觉卡顿得厉害 查看任务管理器 xff0c 内存占用 98 而名为 Vmmem 的进程占用内存高达 2 1 GB 如图 xff1a 二 Vmmem介绍 Vmmem 进程是系统合成的一个虚

随机推荐