29.IO流(了解)

1. C语言的输入与输出

​ C语言中我们用到的最频繁的输入输出方式就是scanf ()printf()scanf(): 从标准输入设备(键 盘)读取数据,并将值存放在变量中。printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)。注意宽度输出和精度输出控制。C语言借助了相应的缓冲区来进行输入与输出。C语言借助了相应的缓冲区来进行输入与输出。如下图所示:

image-20230818191734382

2. C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios

image-20230818192044635

#include<iostream>using namespace std;int main()
{string str;// 判断是否为真// 方法1(整型判断):0为假,非0为真// 方法2(指针判断):nullptr为假,非空为真// str的类型为string,cin >> str其实是重载了operator>>,即// istream& operator>> (istream& is, string& str);// cin的类型为istream// cin再通过隐式类型转换将istream转换为整型,或者指针,这样就可以判断其为真还是假了while (cin >> str){cout << str << endl;}}

image-20230822160100935

  • 原理

image-20230822161314849

演示代码1

#include<iostream>using namespace std;class A
{
public:A(int a):_a1(1),_a2(2){}// 通过这个重载,将自定义类型隐式转换为内置类型(重载int)operator int(){return _a1 + _a2;}private:int _a1;int _a2;
};int main()
{// 内置类型隐式类型转换成自定义类型A aa1 = 1;// 自定义类型隐式类型转换成内置类型(这里调用了operator int();)int a = aa1;cout << a << endl;
}

这段代码演示了自定义类型 A 中的隐式类型转换,以及如何通过重载类型转换操作符 operator int() 实现将自定义类型转换为内置类型 int

代码解释

  1. 自定义类 A

    • A 包含一个构造函数和两个私有成员变量 _a1_a2
    • 没有显式定义类型转换构造函数,但是定义了一个将 A 类型转换为 int 类型的类型转换函数 operator int()
  2. 重载类型转换操作符 operator int()

    • 在类 A 中定义了将 A 类型转换为 int 类型的隐式类型转换操作符。
    • 当类 A 的对象被隐式转换为 int 类型时,将返回 _a1 + _a2 的结果。
  3. 主函数中的隐式类型转换

    • A aa1 = 1;:这里使用 int 类型的整数 1 初始化了类 A 的对象 aa1。由于定义了构造函数 A(int a),因此发生了从内置类型到自定义类型的隐式类型转换。
    • int a = aa1;:这里将类 A 的对象 aa1 隐式转换为 int 类型,通过重载的类型转换操作符 operator int(),返回 _a1 + _a2 的结果。
  4. 输出结果

    • cout << a << endl;:打印变量 a,其值为 _a1 + _a2 的结果,即 1 + 2,输出结果为 3

示例运行结果

3

通过这种方式,可以实现自定义类型到内置类型的隐式类型转换,方便地将自定义类型对象用于与内置类型相关的操作。但需要注意,过度使用隐式类型转换可能会导致代码可读性下降,应谨慎使用。

演示代码2

#include<iostream>using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}// 重载booloperator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}// C++ IO流,使用面向对象+运算符重载的方式
// 能更好的兼容自定义类型,流插入和流提取
int main()
{// 自动识别类型的本质--函数重载// 内置类型可以直接使用--因为库里面ostream类型已经实现了int i = 1;double j = 2.2;cout << i << endl;cout << j << endl;// 自定义类型则需要我们自己重载<< 和 >>Date d(2022, 4, 10);cout << d;// 日期类作为循环条件,因此需要判断日期类为真或者假while (d){cin >> d;cout << d;}return 0;
}

3.C++文件IO流

std::ofstream::open

二进制读写

#include<iostream>
#include<fstream>using namespace std;// 二进制读写(不可以使用string)
struct ServerInfo
{char _address[32];int _port;
};struct ConfigManager
{
public:// 构造函数,私有成员变量为文件的文件名ConfigManager(const char* filename):_filename(filename){}// 将数据写入到文件中void WriteBin(const ServerInfo& info){// ios_base是ofstream的基类,因此两个类域都是可以用的,效果是一致的// ofstream::out,流输出,ofstream::binary 二进制输入,输出// ofstream ofs(_filename, ofstream::out | ofstream::binary);ofstream ofs(_filename, ios_base::out | ios_base::binary);// 将info指向的n个字符写入到文件中(也就是输出到文件中,因此使用的是ofstream)ofs.write((char*)&info, sizeof(info));}// 从文件中读取数据void ReadBin(ServerInfo& info){ifstream ifs(_filename, ios_base::in | ios_base::binary);// 从流中读取n个字符,并将其存储到info中ifs.read((char*)&info, sizeof(info));}private:string _filename; // 配置文件
};int main()
{ConfigManager cm("test.txt");ServerInfo winfo = { "192.0.0.111111111111111111", 80};// 写入到文件// cm.WriteBin(winfo);ServerInfo rinfo;// 从文件中进行读取cm.ReadBin(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;return 0;
}
  • 错误演示(string)
#include<iostream>
#include<fstream>using namespace std;// 二进制读写
struct ServerInfo
{string _address;int _port;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_filename(filename){}// 将数据写入到文件中void WriteBin(const ServerInfo& info){// ios_base是ofstream的基类,因此两个类域都是可以用的,效果是一致的// ofstream::out,流输出,ofstream::binary 二进制输入,输出//ofstream ofs(_filename, ofstream::out | ofstream::binary);ofstream ofs(_filename, ios_base::out | ios_base::binary);// 将info指向的n个字符写入到文件中(也就是输出到文件中,因此使用的是ofstream)ofs.write((char*)&info, sizeof(info));}// 从文件中读取数据void ReadBin(ServerInfo& info){ifstream ifs(_filename, ios_base::in | ios_base::binary);// 从流中读取n个字符,并将其存储到info中ifs.read((char*)&info, sizeof(info));}private:string _filename; // 配置文件
};
  • 情况1
// 情况1:一个进程中,同时读写,_ptr的地址相同
int main()
{ConfigManager cm("test.txt");ServerInfo winfo = { "192.0.0.111111111111111111", 80};// 写入到文件cm.WriteBin(winfo);ServerInfo rinfo;// 从文件中进行读取cm.ReadBin(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;return 0;
}
  • 情况2
// 情况2:两个进程,先写后读,_ptr变为野指针
// 先写
int main()
{ConfigManager cm("test.txt");ServerInfo winfo = { "192.0.0.111111111111111111", 80};// 写入到文件cm.WriteBin(winfo);return 0;
}// 后读
int main()
{ConfigManager cm("test.txt");ServerInfo rinfo;// 从文件中进行读取cm.ReadBin(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;return 0;
}

image-20230822165442415

文本读写

#include<iostream>
#include<fstream>using namespace std;// 日期类
class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}// 文本读写
struct ServerInfo
{// char和string都可以使用,对于文本读写// char _address[32];string _address;int _port;Date _date;
};struct ConfigManager
{
public:ConfigManager(const char* filename):_filename(filename){}void WriteText(const ServerInfo& info){ofstream ofs(_filename);// 输入换行,作为字符串的分隔符ofs << info._address << endl;ofs << info._port << endl;ofs << info._date << endl;}void ReadText(ServerInfo& info){ifstream ifs(_filename);ifs >> info._address;ifs >> info._port;// 因为Date已经重载了流插入和流提取,因此可以直接以流插入的方式进行写入// ifstream是istream的子类(派生类)ifs >> info._date;}private:string _filename; // 配置文件
};
int main()
{ConfigManager cm("test.txt");ServerInfo winfo = { "192.0.0.111111111111111111", 80, {2023,4,1} };// 文件写入cm.WriteText(winfo);// 文件读取ServerInfo rinfo;cm.ReadText(rinfo);cout << rinfo._address << endl;cout << rinfo._port << endl;cout << rinfo._date << endl;return 0;
}

image-20230822171939920

4.stringstream(万物皆可转字符串)

#include<iostream>
#include<fstream>
#include<sstream>using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}
int main()
{int i = 1234;double dl = 2.22;Date d = { 2023, 4, 1 };// 输出到流oss中ostringstream oss;oss << i << " ";   // 使用空格分割字符串oss << dl << " ";oss << d << " ";string str = oss.str();cout << str << endl;int j;double dll;Date dd;// 从流iss中进行提取istringstream iss(str);iss >> j >> dll >> dd;return 0;
}

序列化和反序列化

#include<iostream>
#include<fstream>
#include<sstream>using namespace std;class Date
{friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);
public:Date(int year = 1, int month = 1, int day = 1):_year(year), _month(month), _day(day){}operator bool(){// 这里是随意写的,假设输入_year为0,则结束if (_year == 0)return false;elsereturn true;}
private:int _year;int _month;int _day;
};istream& operator >> (istream& in, Date& d)
{in >> d._year >> d._month >> d._day;return in;
}ostream& operator << (ostream& out, const Date& d)
{out << d._year << " " << d._month << " " << d._day;return out;
}// 序列化和反序列化
struct ChatInfo
{string _name; // 名字int _id;      // idDate _date;   // 时间string _msg;  // 聊天信息
};
int main()
{// stringstream是ostringstream和istringstream的继承,因此其具有他们两个的功能// 序列化ChatInfo winfo = { "张三", 135246, { 2023, 4, 1 }, "晚上一起看电影吧" };stringstream oss;oss << winfo._name << endl;oss << winfo._id << endl;oss << winfo._date << endl;oss << winfo._msg << endl;// oss.str() 转化为c字符串string str = oss.str();cout << "网络发送:" << str << endl;// 反序列化ChatInfo rInfo;stringstream iss(str);iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;cout << "-------------------------------------------------------" << endl;cout << "姓名:" << rInfo._name << "(" << rInfo._id << ") ";cout << rInfo._date << endl;cout << rInfo._name << ":>" << rInfo._msg << endl;cout << "-------------------------------------------------------" << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在面对各种问题时,我们应该如何进行数据分析

python数据分析汇总 前言一、对比分析概念特征类型案例Matplotlib的颜色字母对照表解决遇到未知函数 二、相关性分析概念类型案例一案例二 三、时间序列分析概念类型案例 四、回归分析概念类型案例一案例二案例三 五、决策树概念计算过程案例 六、主成分分析概念计算过程案例 七…

武汉星起航推出亚马逊一站式孵化服务,助力卖家轻松拓展全球市场

亚马逊作为全球最大的电商平台之一&#xff0c;以其全球化的销售平台和完善的物流体系&#xff0c;吸引了众多卖家的目光。通过亚马逊平台&#xff0c;卖家可以轻松地将产品销往世界各地&#xff0c;无需担心复杂的国际贸易流程。而在这个充满机遇的市场中&#xff0c;武汉星起…

IDEA中开发并部署运行WEB项目

IDEA中开发并部署运行WEB项目 1 WEB项目的标准结构2 WEB项目部署的方式3 IDEA中开发并部署运行WEB项目3.1 部署步骤3.2 IDEA关联本地Tomcat 4 IDEA创建web工程5 IDEA部署-运行web项目6 IDEA部署并运行项目的原理 1 WEB项目的标准结构 一个标准的可以用于发布的WEB项目标准结构如…

安防监控视频平台智能边缘分析一体机视频存储系统客流统计检测算法

智能边缘分析一体机的客流统计检测算法是一种基于人工智能与边缘计算技术的解决方案&#xff0c;专门设计用来实时、准确地统计通过特定区域的人流量。这项技术广泛应用于零售、交通、场馆管理、智慧城市等领域&#xff0c;以帮助管理者更好地理解顾客行为、优化资源配置、提升…

RS232/RS485信号转12路模拟信号 YL34隔离D/A转换器 4-20mA/0-5V/0-10V/0-20mA/0-25mA

特点&#xff1a; ● RS-485/232接口&#xff0c;隔离转换成12路标准模拟信号输出 ● 可选型输出4-20mA或0-10V控制其他设备 ● 模拟信号输出精度优于 0.2% ● 可以程控校准模块输出精度 ● 信号输出 / 通讯接口之间隔离耐压3000VDC ● 宽电源供电范围&#xff1a;10 ~ …

什么是控制,什么是控制系统?复杂的动态系统怎么被控制的?

在汽车研发中或者购买新能源汽车中&#xff0c;通常能提到什么EPS控制、ABS控制、智能域控等等各种说法&#xff0c;听起来让人觉得非常不一般&#xff0c;但是&#xff0c;这控制究竟是什么&#xff1f;控制的又是什么&#xff1f;其实很好理解&#xff01; 关注我&#xff0c…

Unity Mirror 从入门到入神(一)

Mirror从入门到成神 文章目录 Mirror从入门到成神简介NetworkClientRegisterPrefabConnect (string address)Disconnect ()activeactiveHost NetworkServerSpawn 简介 Mirror是一个unity网络同步框架&#xff0c;基于MonoBehaviour生命周期的回调的基础上进行数值的同步&#…

HTML+CSS练习小项目——百叶窗

前言&#xff1a;在学习完HTML和CSS之后&#xff0c;我们就可以开始做一些小项目了&#xff0c;本篇文章所讲的是新手可以练习的小项目——百叶窗 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 先让我们看一下效果&#xff1a…

python怎么安装matplotlib

1、登陆官方网址“https://pypi.org/project/matplotlib/#description”&#xff0c;下载安装包。 2、选择合适的安装包&#xff0c;下载下来。 3、将安装包放置到python交互命令窗口的当前目录下。 4、打开windows的命令行窗口&#xff0c;通过"pip install"这个命令…

K8S认证 | CKA题库 + 答案 | 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

如何加密电脑文件夹?重要文件夹怎么加密?

文件夹可以帮助我们管理电脑数据&#xff0c;而文件夹并不具有安全保护功能&#xff0c;很容易导致数据泄露。因此&#xff0c;我们需要加密保护电脑文件夹。那么&#xff0c;如何加密电脑文件夹呢&#xff1f;下面我们就来了解一下。 EFS加密 EFS加密是Windows提供的数据加密…

普通人也能创业!轻资产短视频带货项目,引领普通人实现创业梦想

在这个信息爆炸的时代&#xff0c;创业似乎成为了越来越多人的梦想。然而&#xff0c;传统的创业模式 keJ0277 往往伴随着高昂的资金投入和复杂的管理流程&#xff0c;让许多普通人望而却步。然而&#xff0c;现在有一种轻资产短视频带货项目正在悄然兴起&#xff0c;它以其低…

.net下使用cap实现消息异步处理

介绍 github地址 CAP 是一个基于 .NET Standard 的 C# 库&#xff0c;它是一种处理分布式事务的解决方案&#xff0c;同样具有 EventBus 的功能&#xff0c;它具有轻量级、易使用、高性能等特点。 新建项目 新建.net7web项目 安装依赖包 安装软件 安装redis和Sql Server …

MyBatis操作数据库(动态SQL)

1 动态SQL 动态SQL是MyBatis的特征之一&#xff0c;能够完成不同条件下不同的SQL拼接 1.1 <if>标签 在注册用户的时候&#xff0c;可能会有这样一个问题&#xff0c;由于注册分为两种字段&#xff1a;必填字段和非必填字段&#xff0c;如果在添加用户的时候有不确定的…

一个简单的webservice客户端demo

首先我们是客户端&#xff0c;我们要找一个服务端来配合我们调试&#xff0c;可以在这个网址里找个你喜欢的免费服务WEB服务&#xff08;Web Servicrs&#xff09;| 免费WEB服务 | 商业WEB服务 | XML Web Servicrs - WEBXML 比如下面这个查手机号归属地的&#xff1a; 我们新建…

文字游侠AI丨简直是写作神器,头条爆文一键生成稳定赚米!附渠道和详细教程(只需四步)!

在数字时代的浪潮中&#xff0c;人们不断寻求网络空间中的商机&#xff0c;期望在互联网的浩瀚海洋里捕捉到稳定的财富。随着人工智能技术的突飞猛进&#xff0c;越来越多的AI工具被融入到各行各业&#xff0c;开辟了新天地&#xff0c;带来了创新的盈利模式。 其中&#xff0c…

算法day07

第一题 30. 串联所有单词的子串 上题题意如下&#xff1a; 将w数组里面的字符串随机排列&#xff0c;只要在s字符串中找到相对应的w组成的字符串&#xff0c;则返回s中对应字符串首位元素的第一个下标&#xff1b; 有上述题意所知&#xff0c;解题思路如上一题故事&#xff0c…

在澳门写代码;技术入股2次融资被踢;现在只想做独立开发

本期我们邀请的程序员是Albert&#xff0c;先后在广州、澳门、珠海、香港工作过&#xff0c;打工上班、合伙创业、远程工作、独立开发&#xff0c;工作经历丰富&#xff0c;如果你想知道哪些程序员踩过的坑&#xff0c;请别错过他的故事。 广州&#xff1a;第一份工作2000块一…

代码随想录-算法训练营day41【动态规划04:01背包问题-滚动数组、分割等和子集】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第九章 动态规划part04● 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集 正式开始背包问题,背包问题还是挺难的,虽然大家可能看了很多背包问题模板代码,感觉挺简单,…

【附poc】H5 云商城漏洞

漏洞描述 H5 云商城 file.php 文件上传,攻击者可通过此漏洞上传恶意脚本文件&#xff0c;对服务器的正常运行造成安全威胁&#xff01;漏洞可在圈子中获取&#xff0c;8000陆续更新中&#xff01; 漏洞复现 语法及其界面 1、fofa&#xff08;会员可在圈子获取&#xff09; b…