【C++ 学习 ㊴】- 详解 C++ 的 I/O 流

目录

一、C++ 的 I/O 流

二、C++ 的标准 I/O 流

三、C++ 的文件 I/O 流


 


一、C++ 的 I/O 流

C 语言有一套完成数据读写(I/O)的解决方案:

  • 使用 scanf()、gets() 等函数从键盘读取数据,使用 printf()、puts() 等函数向屏幕输出数据;

  • 使用 fscanf()、fgets() 等函数从文件中读取数据,使用 fprintf()、fputs() 等函数向文件中写入数据。

C 语言的这套 I/O 解决方案也适用于 C++ 程序,但 C++ 独立开发了一套全新的 I/O 解决方案。

本质上来说,C++ 的这套 I/O 解决方案就是一个包含很多类的类库(作为 C++ 标准库的组成部分),这些类常被称为 "流类"

C++ 的开发者认为数据输入和输出的过程也是数据传输的过程,数据像水一样从一个地方流动到另一个地方,所以 C++ 中将此过程称为 "流",实现此过程的类称为 "流类"

下图展示了 C++ 中用于实现数据输入和输出的这些流类以及它们之间的关系:

注意

  1. 图中的箭头代表各个类之间的派生关系。为了解决菱形继承中的问题,从 ios 派生出 istream 和 ostream 时,均使用了 virtual 关键字(虚继承)

  2. 实现标准 I/O 操作的流类为 istream(从键盘读取数据)、ostream(向屏幕输出数据) 和 iostream(兼 istream 和 ostream 类功能于一身)

  3. 实现文件 I/O 操作的流类为 ifstream(从文件中读取数据)、ofstream(向文件中写入数据) 和 fstream(兼 ifstream 和 ofstream 功能于一身)


二、C++ 的标准 I/O 流

cin 是 istream 类对象;cout、cerror 和 clog 是 ostream 类对象。

注意

  1. cerr、clog 的用法和 cout 完全一样,但 cerror 常用来输出警告和错误信息给程序的使用者,clog 常用来输出程序执行过程中的日志信息(此部分信息只有程序开发者看得到,不需要对普通用户公开)

  2. cin 和 cout 可以直接输入和输出内置类型数据,因为标准库中已经将所有内置类型的输入和输出全部重载了

  3. 对于自定义类型,如果要支持 cin 和 cout 的标准输入输出,需要对 << 和 >> 进行重载

    #include <iostream>
    using namespace std;
    ​
    class Date
    {friend istream& operator>>(istream& in, Date& d);friend ostream& operator<<(ostream& out, const Date& d);
    public:Date(int year = 1949, int month = 10, int day = 1): _year(year), _month(month), _day(day){ }
    private:int _year;int _month;int _day;
    };
    ​
    istream& operator>>(istream& in, Date& d)
    {return in >> d._year >> d._month >> d._day;
    }
    ​
    ostream& operator<<(ostream& out, const Date& d)
    {return out << d._year << "-" << d._month << "-" << d._day;
    }
    ​
    int main()
    {Date d;cin >> d;  cout << d << endl;return 0;
    }
  4. 连续输入时,在 VS 中输入 Ctrl + z 结束

    #include <iostream>
    using namespace std;
    ​
    int main()
    {string s;while (cin >> s){cout << s << endl;}return 0;
    }

    注意:cin >> s 等价于 operator>>(cin, s).operator bool()

    类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义了从类类型值到其他类型值的转换

    函数原型

    operator type() [const];

    转换函数必须是成员函数,不能指定返回类型,并且形参列表必须为空


三、C++ 的文件 I/O 流

根据数据的组织形式,文件可分为二进制文件和文本文件

  • 二进制文件是把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放,即存放的是数据的原形式。

  • 文本文件是把数据的终端形式的二进制数据输出到磁盘上存放,即存放的是数据的终端形式。

采用文件流对象操作文件的一般步骤

  1. 定义一个文件流对象;

  2. 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系;

  3. 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写;

  4. 关闭文件。

struct ServerInfo
{char _address[32];int _port;Date _date;
};
​
class ConfigManager
{
public:ConfigManager(const char* filename) : _filename(filename) { }
​void WriteBin(const ServerInfo& info){ofstream ofs(_filename, ios_base::out | ios_base::binary);ofs.write((const char*)&info, sizeof(info));}
​void ReadBin(ServerInfo& info){ifstream ifs(_filename, ios_base::in | ios_base::binary);ifs.read((char*)&info, sizeof(info));}
​void WriteText(const ServerInfo& info){ofstream ofs(_filename);ofs << info._address << " " << info._port << " " << info._date;}
​void ReadText(ServerInfo& info){ifstream ifs(_filename);ifs >> info._address >> info._port >> info._date;}
private:string _filename;  // 配置文件
};
​
int main()
{ServerInfo info = { "192.0.0.1", 80, { 2023, 10, 1 } };
​// 二进制读写ConfigManager cm_bin("test.bin");cm_bin.WriteBin(info);
​ServerInfo info_bin;cm_bin.ReadBin(info_bin);cout << info_bin._address << " " << info_bin._port << " " << info_bin._date << endl;
​// 文本读写ConfigManager cm_text("text.txt");cm_text.WriteText(info);
​ServerInfo info_text;cm_text.ReadText(info_text);cout << info_text._address << " " << info_text._port << " " << info_text._date << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

909-2014-T2

文章目录 1.原题2.算法思想3.关键代码4.完整代码5.运行结果 1.原题 二叉树采用二叉链表存储结构&#xff0c;设计算法&#xff0c;判断二叉树是否为满二叉树。叙述算法思想并给出算法实现。 2.算法思想 通过一次遍历&#xff0c;得到结点个数和树的高度。用结点个数和树的高…

全国市政公用事业和邮政、电信业发展数据,shp/excel格式

随着城市化进程的加速和人们对城市生活品质要求的提高&#xff0c;市政公用事业和邮政、电信业发展越来越受到关注。 今天我们来分享全国市政公用事业和邮政、电信业发展数据&#xff0c;为读者呈现一个更加全面的行业发展图景。 首先了解下数据的基本信息&#xff0c;格式为s…

2023亿发数字化智能工单,专业管理工单处理全流程,助力企业转型腾飞

伴随着智能化和信息化的不断深入&#xff0c;企业数字化转型势如腾飞。在这个过程中&#xff0c;工单管理成为生产、家电、后勤等多个管理场景下频繁应用的关键环节。如何满足管理方对设备、服务等智能化管理的需求&#xff0c;提升工单管理效率、规范管理流程&#xff0c;并实…

Fiddler模拟弱网环境

1.设置弱网&#xff1a;Rules-》Customize Rules 上传速度&#xff1a;1KB/300ms1KB/0.3s3.33KB/s 下载速度&#xff1a;1KB/150ms1KB/0.15s6.67KB/s 2.启动弱网&#xff1a;Rules-》Performance-》Simulate Modem Speeds 开启后&#xff0c;此项为勾选状态 3.验证弱网生效…

光量子计算再创融资高峰!法国 Quandela获投5000万欧元

​&#xff08;图片来源&#xff1a;网络&#xff09; 法国光量子计算公司Quandela致力于开发首台光量子计算机&#xff0c;目前已获得超过5,000万欧元的巨额融资。投资者包括通过“法国2030计划”获得的法国政府支持以及银行合作伙伴、个人。新的投资者包括法国投资公司Seren…

第十九章 绘图

目录 Java绘图类 Graphics 类 Graphics2D类 绘制图形 绘图颜色与画笔属性 设置颜色 设置画笔 绘制文本 设置字体 显示文字 显示图片 图像处理 放大与缩小 图像翻转 图像旋转 图像倾斜 Java绘图类 Graphics 类 Grapics 类是所有图形上…

Idea 2023.2.5配置(插件、Maven等)

IDEA2023.2.5配置 一. 插件Alibaba Java Coding Guidelines plugin supportMaven HelperMyBatisXSonarLintTranslationVuesion Theme 二. 自定义创建live template&#xff0c;快速写代码三. 修改全局配置3.1 Maven配置3.1.1 安装MavenStep1. 下载Step2. 安装Step3. 创建系统环…

NV080D语音芯片:让智能快递柜取件更便利

随着互联网的普及和电子商务的迅速发展&#xff0c;网购消费已经成为了越来越多人的选择。这也催生了一个庞大的“网购一族”&#xff0c;他们购买的各种商品会通过快递公司送到家门口。然而&#xff0c;收取快递往往也伴随着一系列问题。比如&#xff0c;派送时间和收件人取件…

详解python淘宝秒杀抢购脚本程序实现

文章目录 前言一、官网下载火狐浏览器二、下载geckodriver&#xff0c;并解压到火狐浏览器文件夹根目录三、添加火狐浏览器根目录到系统环境变量四、下载并安装python及pycharm开发工具五、进入淘宝六、使用Pycharm运行脚本&#xff0c;新建python文件&#xff0c;将代码复制到…

MP3音频文件体积怎么缩小?压缩的方法有哪些?

压缩音频文件可减小文件的大小&#xff0c;从而更轻松地上传到其他平台&#xff0c;或轻松的通过电子邮件进行分享。除此之外&#xff0c;压缩音频文件还可以节省硬盘上的储存空间。那MP3音频文件体积怎么缩小呢&#xff1f;继续阅读可查看压缩的详细流程。 什么是音频文件压缩…

Jumpserver开启MFA认证,SecureCRT自动输入登录

1、JumpServer开启MFA认证 开启MFA认证&#xff1a; 开启后效果&#xff1a; 2、使用浏览器登录堡垒机&#xff0c;配置MFA 按需下载对应app进行绑定 到此手机绑定成功&#xff0c;登录时候可以在手机app查看动态码。 但是每次登录&#xff0c;都需要打开手机&#xff0c;…

RFID电网资产全寿命周期管理解决方案

一、方案背景 随着电网公司对电网资产全寿命周期管理的要求日益明确&#xff0c;许多电网公司已经开始积极推进存量资产PMS、PM与AM数据的联动对应&#xff0c;并将联动成果纳入资产全寿命周期管理一体化平台进行指标考核。然而&#xff0c;由于资产变动导致数据质量下降的问题…

数据库实验一 数据表的创建与修改管理

数据库实验一、数据表的创建与修改管理实验 一、实验目的二、设计性实验三、观察与思考 一、实验目的 (1) 掌握表的基础知识。 (2) 掌握使用SQL语句创建表的方法。 (3) 掌握表的修改、查看、删除等基本操作方法。 (4) 掌握表中完整性约束的定义。 (5) 掌握完整性约束的作用 二…

leetcode:反转链表

题目描述 题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL&#xff0c;n2指向head&#xff0c;n3指向第二个结点 当n2不为NULL的时候&#xff0c;让n2->ne…

2023年中国雷达设备市场规模及市场份额分析[图]

雷达设备行业是一种利用无线电波对目标进行探测和定位的技术&#xff0c;也被称为无线电探测和定位。雷达通过发射电磁波对目标进行照射并接收其回波&#xff0c;经波形处理后获取目标的位置和速度等信息。雷达具有探测距离远&#xff0c;测定精度高&#xff0c;不受天气和地形…

设计模式-访问者模式-笔记

Visitor模式 动机&#xff08;Morivation&#xff09; 在软件构建过程中&#xff0c;由于需求的变化&#xff0c;某些类层次结构中常常需要增加新的行为&#xff08;方法&#xff09;&#xff0c;如果直接在基类中做这样的更改&#xff0c;将会给子类带来很繁重的变更负担&am…

汇编基础知识

1.1 机器语言 机器语言就是一些二进制代码&#xff0c;存放在内存中。它是机器指令的集合&#xff0c;所谓机器指令就是机器能够正确执行的命令 1.2 汇编语言的产生 1.汇编语言的主体是汇编指令 2.汇编指令实际上就是机器指令的助记符。它们的唯一区别在于书写方式上 寄存器…

React+后端实现导出Excle表格的功能

最近在做一个基于Reactantd前端框架的Excel导出功能&#xff0c;我主要在后端做了处理&#xff0c;这个功能完成后&#xff0c;便总结成一篇技术分享文章&#xff0c;感兴趣的小伙伴可以参考该分享来做导出excle表格功能&#xff0c;以下步骤同样适用于vue框架&#xff0c;或者…

nginx安装之后修改配置无效

这个问题排查了一晚上&#xff0c;配置怎么改都无效。原本以为错误信息在控制台就能告诉我们&#xff0c;但有些错误信息它都放在日志。查看了日志才发现是没有权限引起的。 这种情况一般是防火墙引起的。可以临时关闭防火墙测试一下 输入如下命令 setenforce 0 如果您使用的…

(vue)前后端配合实现文件预览功能

(vue)前后端配合实现文件预览功能 1.页面&#xff1a; 2.后台返回数据&#xff1a; 3.预览效果&#xff1a; 4.代码&#xff1a; <el-descriptions-item><template slot"label">文件名称</template><el-button type"text" click"…