C++之ofstream::flush与ofstream::close

article/2025/10/19 8:07:36
一.缓冲区知识
1.什么是缓冲区
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。

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

2.为什么要引入缓冲区
我们为什么要引入缓冲区呢?
比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
又比如,我们使用打印机打印文档,由于打印机的打印速度相对较慢,我们先把文档输出到打印机相应的缓冲区,打印机再自行逐步打印,这时我们的CPU可以处理别的事情。

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

3.缓冲区的类型
缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。
1)全缓冲
在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
2)行缓冲
在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘输入数据。
3)不带缓冲

也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。

二.实例演示
1.全缓冲
#include<fstream> 
#include <iostream>
using namespace std;
int main()
{//创建文件test.txt并打开  ofstream outfile("test.txt");//向test.txt文件中写入4096个字符’a’  for (int n = 0; n < 4096; n++){outfile << 'A';}// 暂停,按任意键继续。此时4096个A还在缓冲区中,并未输出到文件。  system("PAUSE");outfile << 'B';// 暂停,按任意键继续。此时会输出4096个A到文件中(不包括B),说明缓冲区的大小为4k,// 当缓冲区溢出时,缓冲区会自动刷新。system("PAUSE"); outfile << 'C';// 暂停,按任意键继续。此时缓冲区包含BC。system("PAUSE");outfile << 'D';// 暂停,按任意键继续。此时缓冲区包含BCD。// 当按任意键时,程序结束,BCD会一起输出到文件中。system("PAUSE");return 0;
}


如果在第四个system("PAUSE");前加上outfile.flush()、outfile.close()或outfile << endl;都会使BCD在程序结束前就输出到文件。
那么他们三个有什么区别呢?如果代码改成如下所示,就可以看到区别了。
......
outfile << 'D';
outfile.flush()、outfile.close()或outfile << endl;
outfile << 'E';
system("PAUSE");
return 0;
1)outfile.flush()
E会紧接着D后面,即BCDE
2)outfile.close()
E并不会输出
3)outfile << endl
E会在BCD的下一行输出,即
BCD

E

2.行缓冲
先介绍getchar()函数。
函数原型:int getchar(void);
说明:当程序调用getchar()函数时,程序就等着用户按键,用户输入的字符被存放在键盘缓冲区中,直到用户按回车为止(回车字符也放在缓冲区中)。当用户键入回车之后,getchar()函数才开始从键盘缓冲区中每次读入一个字符。也就是说,后续的getchar()函数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才重新等待用户按键。
不知道您明白了没有,再通俗一点讲,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符,直到缓冲区中的字符读完后,才等待用户按键。
#include <iostream>  
using namespace std;
int main()
{char c;//第一次调用getchar()函数  //程序执行时,您可以输入一串字符并按下回车键,按下回车键后该函数才返回  c = getchar();//显示getchar()函数的返回值  cout << c << endl;//暂停  system("PAUSE");//循环多次调用getchar()函数  //将每次调用getchar()函数的返回值显示出来  //直到遇到回车符才结束  while ((c = getchar()) != '\n'){cout << c ;}cout << endl;//暂停  system("PAUSE");return 0;
}

3.不带缓冲
标准错误输出不带缓冲,例如

cerr<<”错误,请检查输入的参数!”; 

三.缓冲区的刷新
刷新缓冲区,就是将缓冲区中的数据进行真正的I/O,并然后清空缓冲区。从上面的实例可以看出,下列情况会引发缓冲区的刷新:
1.缓冲区满时;
2.程序结束时;
3.执行flush语句;
4.关闭文件,即执行close语句;

5.执行endl语句。


参考链接:https://www.cnblogs.com/limera/p/buffer.html


http://chatgpt.dhexx.cn/article/MqSftKe8.shtml

相关文章

超详细ofstream和ifstream详细用法

ofstream和ifstream详细用法 ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间(文章最末尾附上了MSDN中关于这两个函数的解释); 在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两…

ifstream和ofstream的理解

ifstream和ofstream的理解 开发工具与关键技术&#xff1a;Visual Studio、C 作者&#xff1a;张国军 撰写时间&#xff1a;2019年06月04日各种计算机应用系统通常把一些相关信息组织起来保存在外存储器中&#xff0c;称为文件&#xff0c;并用一个名字&#xff08;称为文件名…

【Stream】

1、stream不存储数据&#xff0c;而是按照特定的规则对数据进行计算&#xff0c;一般会输出结果&#xff1b; 2、stream不会改变数据源&#xff0c;通常情况下会产生一个新的集合&#xff1b; 3、stream具有延迟执行特性&#xff0c;只有调用终端操作时&#xff0c;中间操作才会…

(转载)C++ ofstream和ifstream详细用法

原文出自【比特网】&#xff0c;转载请保留原文链接&#xff1a;http://soft.chinabyte.com/database/460/11433960.sh [导读] ofstream是从内存到硬盘&#xff0c;ifstream是从硬盘到内存&#xff0c;其实所谓的流缓冲就是内存空间 在C中&#xff0c;有一个stream这个类&…

Stream流:

创建stream流&#xff1a; //单列集合 集合.stream//数组 stream.of(数组)//双列集合 map.entrySet().stream(); stream流的调试&#xff1a; 常用API: - map:相当于对数据进行一个操作&#xff0c;可以自定义返回值等 stream.map() - distinct:可以去除流中的相同元素&…

c++输出文件流ofstream用法详解

目录 一. 输入流 ofstream 用法 Public member functions (1-6) 1&#xff0c; (constructor) 2&#xff0c; ofstream::open 3&#xff0c; ofstream::is_open 4&#xff0c; ofstream::close 5&#xff0c; ofstream::rdbuf 6&#xff0c;ofstream::operator Public member …

C++文件和流

C文件和流 到目前为止&#xff0c;我们已经使用了 iostream 标准库&#xff0c;它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流。 本教程介绍如何从文件读取流和向文件写入流。这就需要用到 C 中另一个标准库 fstream&#xff0c;它定义了三个新的数据…

什么是https

HTTPS&#xff08;全称&#xff1a;Hypertext Transfer Protocol over Secure Socket Layer&#xff09;&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;因此加密的详细内容请看SSL。 …

http和https有什么区别 端口号多少

HTTP和HTTPS的基本概念 HTTP&#xff1a;超文本传输协议&#xff0c;是在互联网上应用最广泛的一种网络协议。是一个客户端和服务端请求和应答的标准&#xff08;TCP&#xff09;&#xff0c;用于从WWW&#xff08;超文本&#xff09;服务器传输超文本到本地浏览器的传输协议。…

https 请求的端口是443 注意

注意: 这里录制https的请求 端口号一定是443 才可以抓取到!!!!!! &#xff08;进坑多次&#xff09; 转载于:https://www.cnblogs.com/kaibindirver/p/9223595.html

IP地址,开放端口,http与https的区别

文章目录 一、IP地址的概述二、IP地址分类1、**共有地址**2、 **私有地址** 三、IPV4和V6四、子网掩码、网关、DNS1、 子网掩码2、网关3、DNS服务器 五、获取目标IP地址的方法1、 通过ping命令&#xff1a;2、 通过NSLOOKUP命令&#xff1a;1.使用资源监视器查看&#xff1a;2.…

Linux网络——图解HTTPS协议与端口号认识

Linux网络——图解HTTPS协议与端口号认识 一、确保HTTP安全的方式1.1 HTTP明文加密<1> 通信加密<2> 内容加密 1.2 验证通信方身份1.3 验证报文完整性&#xff0c;防止被篡改 二、HTTP加密认证完整性保护HTTPS2.1 SSL/TLS2.2 对称加密2.3 非对称加密2.4 混合加密 三…

什么是SSL端口?HTTPS配置技术指南

安全套接字层&#xff08;SSL&#xff09;是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间&#xff08;通常在服务器和客户端之间&#xff09;之间通过互联网发送的数据&#xff0c;使其保持私密。随着在线隐私的重要性日益增加&#xff0c;您应该熟悉SSL端…

--端口--

目录 一、端口的读写 二、shl和shr指令 我们在之前所讲过&#xff0c;各种存储器都和CPU的地址线、数据线、控制线相连。CPU在操控它们的时候&#xff0c;把它们当做内存来看待&#xff0c;把它们总地看做一个由若干存储单元组成的逻辑存储器&#xff0c;这个逻辑存储器我们称…

服务器中如何检查端口是否开放

服务器中如何检查端口是否开放 端口对于一台服务器来说是至关重要的&#xff0c;它是服务器与外部网络设备的协议出口&#xff0c;它一共拥有65536个(0-65535)&#xff0c;其中一些端口已经是约定好什么协议在使用了的&#xff0c;像80端口就是web服务使用、3389端口是Windows远…

部署https证书的端口是什么意思

端口号能够觉得是机器设备与外部通信沟通交流的出入口。http的端口号为80&#xff0c;那么&#xff0c;你知不知道https证书的端口是什么吗&#xff1f;今日小编就来详细介绍下。 https证书的端口是什么 https证书布署安装&#xff0c;网络服务器必须关联端口号&#xff0c;一…

一分钟了解HTTP和HTTPS协议

很多人存在这样的疑惑就是http与https的区别&#xff0c;这篇文章就跟大家介绍一下。一句话总结HTTPS是身披SSL外壳的HTTP&#xff0c;HTTPS更安全&#xff0c;实际使用中绝大多数的网站现在都采用的是HTTPS协议&#xff0c;这也是未来互联网发展的趋势。 什么是协议&#xff1…

MVC5项目发布到IIS

1.右击项目&#xff0c;点击发布&#xff08;本人用的是vs2017&#xff09; 2 选择要发布的目标位置&#xff0c;简单说就是你想把发布生成的文件保存到哪里。本人在F盘建了个MVCPublishToIIS的文件夹。 发布方法选择文件系统(File System) 3 点击下一页继续 配置选择Release 发…

创建ASP.NET MVC5 应用程序

创建第一个ASP.NET MVC项目。使用Visual Studio 2017/2019创建ASP.NET MVC5应用程序&#xff0c;要求如下&#xff1a; &#xff08;1&#xff09;选择“MVC”模板&#xff0c;创建ASP.NET MVC应用程序。 &#xff08;2&#xff09;分别修改主页、关于我们及联系方式页面内容。…

[Asp.Net MVC5](一)- 理解MVC模式

1. MVC模式概念 MVC模式&#xff08;Model-View-Controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为以下三个基本部分&#xff1a; ◆Model封装了你的应用数据、应用流程和业务逻辑。“模型”有对数据直接访问的权力&#xff0c;例如对数据库的…