C++:IO流

目录

关于C++IO流

C/C++中的日期输入

连续输入的问题

C++文件IO流

运算符>>的运用

二进制读写

文本读写

stringstream


关于C++IO流

C++系统中ios为基类,其他类都是直接或间接派生自ios类

C++标准库提供了4个全局流对象cin、cout、cerr、clog (在使用时候必须要包含文件并引入std标准命名空间)

使用cout进行标准输出,即数据从内存流向控制台(显示器)

使用cin进行标准输入即数据通过键盘输入到程序中

使用cerr用来进行标准错误的输出

使用clog进行日志的输出


C/C++中的日期输入

例如要求输入的是20231125,C/C++分别是如何输入年月日的:

C语言:

采用scanf输入,%nd可以用来表示输入n个数据:

通过调试可以清楚的发现,year, month, day可以满足要求

C++:

C++的cout并不支持%nd的语法,但是C++有string,可以将string中的substr,stoi结合使用

其中substr(0, 4)表示的是从0位置开始,取出4个数据stoi(str.substr(0, 4))则表示将取出的4个数据转为整型,year, month, day都是使用这种方式读入的


连续输入的问题

连续输入的问题也就是有多行测试用例的问题,在有些题目中,需要有多行测试用例

其中C语言是以下方式进行的:

scanf如果没有获取成功就返回EOF,EOF是宏定义的-1,运行结果为: 


而C++是下面这种方式:

运行结果与C语言是一样的:

C++之所以可以在while的判断语句中用cin>>str来判断是否结束,是因为istream类型的cin对象调用operator bool,operator bool会根据输入的内容来返回true或false,所以可以用于连续输入的判断

这两种方式如果想结束连续输入,只需要Ctrl + C即可终止,这种是比较暴力的终止,在Linux信号部分也说到过,Ctrl + C相当于直接发送一个终止信号来终止进程


C++文件IO流

C++中ifstream是读文件,C++中cin是流提取,cin是从终端提取,所以ifstream就是从文件中提取,也就是我们所说的读文件

下面简单演示用法:

例如我们当前VS的文件名叫做test.cc,它可以不指定打开方式,因为有缺省参数,默认读文件,如下图:

get函数就类似于C语言文件中的fgetc函数

所以上述例子运行的结果就是将test.cc文件中的代码全部打印出来


运算符>>的运用

C语言能用fscanf将文件中的内容打印出来,C++自然也能做到,并且相比于C语言也是有一定优势的,因为C++重载了运算符>>,内置类型可以调用库中的operator >>,ifstream继承的istream,而istream重载了下面的这些内置类型,所以可以直接使用运算符>>读取普通文件的内容:

下面简单演示:

首先在当前打开的VS的路径下,创建一个tmp.txt的普通文件,在其中写几个数据:

然后使用运算符>>,调用库中的运算符重载>>,直接读取:

而C++文件操作的优势,例如自定义类型的类如Date日期类,如果在tmp.txt中有日期2024 10 24,C语言由于各种方面的原因,读取时可能会有些问题,而C++的运算符重载可以完美的解决这种情况,tmp.txt中多了一行日期:

代码中可以直接使用运算符>>提取日期类对象dt:

而可以支持ifs提取日期类对象dt的前提,就是我们在Date类中必须要重载运算符>>,所以自定义类型Date的对象dt才可以使用

Date类中重载的运算符>>中,参数是istream类型的,由于ifstream是istream的子类,所以ifstream类型的对象ifs在调用运算符>>,依然可以调用:

结果如下,非常轻松的就能够提取出tmp.txt文件中的日期:2024 10 24


二进制读写

二进制读写:在内存如何存储,就如何写到磁盘文件
优点:快;缺点:写出去的内容看不见

下面看代码示例:

有一个Server类,里面内容是IP和端口
有一个Manager类,里面包含二进制的读写函数,还有配置文件_filename

二进制的写操作:

此时运行代码,在当前路径下就会出现一个server.config的普通文件,内容如下:

观察文件内容,IP可以清楚读出来是192.0.0.1,而端口却是乱码的形式,这是因为IP是字符串存储的,字符串是编码的方式存储的,所以写出去以后只要文件打开的编码方式和磁盘相同,自然就能够看见内容

而端口是整型,存储是和字符串的存储不同的,是按照原反补等方式计算的,而文件中并没有整型的概念,所以我们是看不见的


二进制的读操作

main函数中改变如下部分代码,即可进行二进制的读操作:

在磁盘中什么内容,读回来就是什么内容,结果如下:

这里需要注意的一点是:二进制读写有一定的局限性,需要注意,不可用包含string、vector等类的数据进行读写,以string类举个例子,string在Windows中如果存储较长的数据就会开辟在堆上,这时写入文件中的就是一个指向这个开辟在堆上的字符串的地址,也就是一个指针,写入结束后,调用析构函数会进行销毁

而接下来如果进行读取,因为此时是一个新的进程,之前的地址已经被销毁了,此时读取之前存储的指针时,就变为了野指针,因为之前存储的指针是对应的上一个进程在堆上开辟的,上一个进程结束时已经销毁,此时新进程读取自然会出错


文本读写

文本读写:对象数据序列化字符串写出来,读回来也是字符串,反序列化转成对象数据
优点:可以看见写出去是什么;缺点:存在一个转换的过程,要慢一些

文本的写操作:

代码如下:

写操作的代码在_add和_port中间加了换行符,一遍更好的读取数据,也为了接下来的文本读操作更加方便

运行代码后,在当前路径下就会出现一个server.config的普通文件,内容如下:

与二进制写不同的是,文本写操作我们可以清楚看到内容


文本的读操作:

main函数如下:

运行结果为:

也可以很好地打印出来


上面这种文本的读写方式还是有些麻烦,最简便的方式还是会用到重载的运算符>>与<<

文本读和文本写的实现变为下图的方式,如下所示:

运行结果与上面的实现方式是一样的

当有自定义类型,例如日期类时,只要日期类中重载了运算符>>与<<即可照常使用


stringstream

像上面单个对象,可以使用string中的to_string、stoi、stod等函数转换,但是如果多种类型的转换,比如说一个结构体中有各种类型的对象,既有内置类型,又有自定义类型,比较复杂,这时就可以考虑使用stringstream了,比较方便,具体如下所示:

结构体中,有多中不同类型的变量:

此时就可以考虑使用stringstream,需要包头文件sstream,使用方法如下:

其中函数str()是可以拿到序列化的字符串,调试观察str这个字符串是这样的:

打印结果如图:

上面这种过程就叫做序列化,即不论是什么类型的对象,都转化为字符串

既然有序列化,也就有反序列化,反序列化就是将上面转化出来的字符串解析出来

这时就可以运用istringstream,将上面的str字符串解析出来:

创建一个对象rex,将上面的字符串str传入istringstream类型得对象iss,然后就可以反序列化str了

通过监视窗口可以看到:

也可以将rex的各个对象打印出来,或是显示在某个界面上

stringstream的优势就是不仅仅可以对内置类型处理,也可以对自定义类型进行处理(例如上图的_date),只要自定义类型重载了>>和<<运算符即可

当然也有一种更为简便的方式,不去区分istringstream和ostringstream,直接使用stringstream即可,因为stringstream既继承了istringstream,又继承了ostringstream的内容:


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

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

相关文章

LeetCode刷题计划

LeetCode刷题计划 推荐 代码随想录&#xff1a;https://github.com/youngyangyang04/leetcode-master 卡码网 练习ACM模式 https://kamacoder.com/ 01 #include <iostream> using namespace std;int main() {int a ,b;while(cin>>a>>b){cout<<ab<…

【AI视野·今日CV 计算机视觉论文速览 第293期】Fri, 19 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 19 Jan 2024 Totally 103 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers ParaHome: Parameterizing Everyday Home Activities Towards 3D Generative Modeling of Human-Object Interactions Aut…

PyTorch深度学习快速入门教程 - 【小土堆学习笔记】

小土堆Pytorch视频教程链接 声明&#xff1a; 博主本人技术力不高&#xff0c;这篇博客可能会因为个人水平问题出现一些错误&#xff0c;但作为小白&#xff0c;还是希望能写下一些碰到的坑&#xff0c;尽力帮到其他小白 1 环境配置 1.1 pycharm pycharm建议使用2020的&…

petalinux2018.3安装步骤

1、虚拟机安装ubuntu-16.04.7-desktop-amd64.iso &#xff08;注意&#xff1a;安装ubuntu-18.04.6-desktop-amd64.iso和ubuntu-16.04.6-desktop-i386.iso会报以下错误&#xff09; environment: line 314: ((: 10 #15~1 > 10 #3: syntax error in expression (error toke…

Excel

1、Excel的学习路径 2、掌握excel的基础要求 01、保证新版本 02、培养好的数据表格习惯 03、主动性探索 04、多联系 一、函数 二、文本清洗函数 三、常见文本的清洗函数 获取k的位置 FIND("k",P2,1) 从第1个位置开始在位置P2&#xff0c;查询字段k&#x…

Java+SpringBoot+Vue:高校科研管理的技术革新

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

ChatGPT高效提问—prompt实践(智能开发)

ChatGPT高效提问—prompt实践&#xff08;智能开发&#xff09; ​ 如果你是一名程序员&#xff0c;一定有过这样的经历&#xff1a;排查某个bug话费好几个小时&#xff0c;在各个搜索引擎尝试搜索&#xff0c;浏览了几十甚至上百个网站&#xff0c;结果搜到的答案千篇一律&am…

websocket简易基操

一、概述 1.1 简介 WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的&#xff0c;Websocket是一个持久化的协议。…

【STM32 CubeMX】GPIO的工作模式

文章目录 前言一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 总结 前言 在嵌入式系统开发中&#xff0c;对于STM32微控制器的GPIO&#xff08;General Purpose Input/Output&#xff09;引脚的配置和使用是至关重要的。GPIO引脚可以通…

【解决】配置文件YAML: application.yml Cannot resolve configuration property ‘xxxx‘

配置文件YAML: application.yml Cannot resolve configuration property xxxx 问题排查解决 问题 在application.yml文件里面配置Bean的初始值&#xff0c;但是报错如下&#xff1a; Cannot resolve configuration property person.lastName 排查 我们先去Bean检查是否拼写…

基于函数计算AIGC图片识别

目录 在 OSS 中建立图片目录 在函数计算中基于模板创建ImageAI应用 体验ImageAI图像识别效果 我们不但可以基于函数计算创建AIGC应用&#xff0c;实现以文生图&#xff0c;同时我们也可以基于函数计算创建ImageAI应用&#xff0c;通过简单几步实现对图片中对象的识别。下面我…

【运维测试】测试理论+工具总结笔记第1篇:测试理论的主要内容(已分享,附代码)

本系列文章md笔记&#xff08;已分享&#xff09;主要讨论测试理论测试工具相关知识。Python测试理论的主要内容&#xff0c;掌握软件测试的基本流程&#xff0c;知道软件测试的V和W模型的优缺点&#xff0c;掌握测试用例设计的要素&#xff0c;掌握等价类划分法、边界值法、因…

qt“五彩斑斓“ opengl

本篇文章我们来描述一下opengl相关知识 我们先看一下opengl渲染的效果 很漂亮&#xff1f; 那下面就来介绍一下这么漂亮的opengl OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的图形编程接口&#xff0c;用于渲染2D和3D图形。它提供了一系列函数和数据结…

Zotero插件分享(第二弹)

今天紧接上一篇文章&#xff08;Zotero常用插件分享&#xff09;&#xff0c;继续分享关于Zotero常用插件的相关内容。&#xff08;排名不分先后&#xff09; 1.Translate for Zotero 英文文献阅读辅助工具&#xff0c;可以实现将pdf中选中的文字翻译为指定语言&#xff0c;并…

Git中Idea操作git及Git Flow

目录 一、Idea中使用Git 1.idea配置Git和Gitee 2.实践操作 1.将本地项目推送到远程 2.从远程库克隆项目到本地 二、Git Flow 1.什么是Git Flow 2.工作流程 3.实践操作 一、Idea中使用Git 1.idea配置Git和Gitee 第一步&#xff1a;设置git.exe的安装路径 在设置中的…

RMSNorm原理及代码

RMSNorm原理及代码 在大模型中使用层归一化有如下几个因素&#xff1a; 改善网络稳定性加速收敛速度提高模型的泛化能力 批量归一化是对一个批次内的数据进行归一化 层归一化是对一个样本中的不同特征进行归一化 如下是LayerNorm与RMSNorm的公式 在LLaMA中使用RMSNorm替代…

DolphinScheduler安装与配置

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用。 DolphinScheduler的主要角色如下&#xff1a; MasterServer采用分布式无…

二分查找算法及其简单应用(C语言实现)

目录 二分查找算法介绍 二分查找算法的简单应用 二分查找算法介绍 二分查找算法&#xff0c;指在一组有序的数组内查找数值&#xff0c;查找的数值与查找范围内的中间数值进行比较&#xff0c;如果比中间数值小&#xff0c;则在原范围内的左侧范围内重复与该范围内的中间数值…

GPT4:画一只小怪兽,但是不断升级

请你画一只1级的萌怪兽 请你画一只3级的萌怪兽 请你画一只5级的小怪兽 请你画一只10级的小怪兽 请你画一只50级的怪兽 请你画一只100级的怪兽 怪兽被闪电劈了一下&#xff0c;变成了一只0.1级的可爱小怪兽

喝汽水问题

目录 一、题目二、思路二、方法2.1方法一2.2方法二 一、题目 题目&#xff1a;水已知1瓶汽水1元&#xff0c;2个空瓶可以换⼀瓶汽水&#xff0c;输⼊整数money&#xff08;money>0&#xff09;&#xff0c;表示money元钱&#xff0c;计算可以多少汽水&#xff0c;请编程实现…