当前位置: 首页 > news >正文

【C++】文件IO流

一起来康康C++中的文件IO操作吧

文章目录

  • 1.operator bool
  • 2.C++文件IO流
  • 3.文件操作
    • 3.0 关于按位与的说明
    • 3.1 ifstream
    • 3.2 ofstream
      • 流插入文本
    • 3.3 ostringstream/istringstream
    • 3.4 stringstream
    • 3.5使用stringstream的注意事项
  • 结语

1.operator bool

之前写OJ的时候,就已经用过上面这种方式来获取多组测试用例

string s;
while(cin>>s)
{cout << s << endl;
}

不过之前一直没有去了解这里的底层原理是什么,借此机会一并说明

io流可以进行while判断的依据,是因为库的源码中重载了operator bool

image-20221021083819728

没错,operator不仅可以重载一个操作符,它还可以重载一个类型!即将这个类转换为bool类型,return 一个bool类型的值用于while的判断

同理,重载int/double这些类型都是可行的!

另外,要想停止上面的多组输入,在VS下可以用ctrl+z的方式解决,而不要用ctrl+c直接杀掉进程


2.C++文件IO流

image-20221021084123029

C++的文件io类设计的较为复杂,其中还出现了菱形继承,也就是我们最常用的iostream

上面提到的operator bool就是基类IOS实现的,子类都没有去重写

  • cout为标准输出,将数据从内存流中输入到显示器上
  • cin为标准输入,通过键盘输入数据到程序中
  • cerr用于标准错误的输出
  • clog进行日志输出

其中需要注意的一点是,空格和回车会被当作数据之间的分隔符,所以字符串中不能有空格,回车和空格也不能通过cin读入

如果需要读入带空格的完整一行,可以使用getline函数

  • 为什么cin和cout可以输入输出所有类型?

因为库里面已经将所有类型通过操作符重载<<>>实现了,达到了自动类型识别的效果

3.文件操作

C++标准库中提供的打开方式如下,我们可以根据不同情况传入不同的值,或者一次性用按位或|传入多个打开方法

image-20221021131806044

同时因为C++类和对象会自动调用析构函数,所以我们也不需要手动close文件

3.0 关于按位与的说明

这里为何可以用按位与传入多个方法?

假设这些方法就是简单的数字2/4/8(必须是2的倍数)我们可以通过按位与了之后,在按位或,判断某一个数字是否在其中

image-20221021134429643

如果或了之后的数字等于它本身,说明数据在其中!

  • 为什么需要是2的倍数呢?

image-20221022102400142

这种方法在linux中常见,比如linux系统的文件接口

3.1 ifstream

image-20221021130324611

这个对象是用于读取文件的,默认情况下,传入的打开方法为in

void test1()
{ifstream ifs("test.txt");while (ifs){char ch = ifs.get();cout << ch;}
}

image-20221021131949014

因为重载了bool,所以可以很方便的直接用while来判断结束,成功输出了文件中的内容

	ifstream ifs("test.txt");char ch;while (ifs >> ch){cout << ch;}

第二种读取方法采用了流插入>>上面提到过,流提取和插入的时候,会把空格和换行当作数据的分隔符,所以它是不能打印出空格和换行

image-20221021132102499

3.2 ofstream

image-20221021200201898

写文件的方式同上,用out方法打开文件就可以了(默认传的就是out)

	ofstream ifs2("test1.txt",ios::out);char str[] = "i love u\n";ifs2.write(str,sizeof(str));

image-20221021133644760

不过这个和C语言的w方法一样,写入的时候会覆盖文件中已有的内容。如果想进行追加,则需要在后面加上app;如果是执行二进制读写,则需要与上ios::binary

	ofstream ifs2("test1.txt",ios::out|ios::app);char str[] = "i love u";ifs2.write(str,sizeof(str));

image-20221021133902913

运行成功后会在文件尾部追加内容

注意,这里的字符串不能用string进行处理,因为string内部只存了一个指向字符串空间的指针,写入string相当于把指针写入进文件中,是么有用的!

image-20221021135154450

流插入文本

但是,如果我们用<<进行提取的时候,就可以用string了

void test2()
{ifstream ifs("test.txt");ofstream ofs("test1.txt");char ch;ch = ifs.get();while (~ch){ofs << ch;cout << ch;ch = ifs.get();}string s("i love you");ofs << s;
}

程序运行后,会把test.txt中的内容输出到控制台,同时写入到test1.txt

最后还会写入一个string的内容

image-20221021200810379

这是因为我们调用<<的时候,就和cin<<s一样,调用的是string重载的流提取操作符

底层实现的时候会将其转为C语言的字符串,从而写入到了文件中

所以当我们需要写入一个自定义类型的时候,可以重载流提取操作符,不仅可以更方便的打印,还可以写入到文件中


3.3 ostringstream/istringstream

这个类可以将不同的类型转为字符串

这种操作被称为序列化和反序列化,在处理自定义类型的时候非常好用

struct Date
{
public:friend ostream& operator << (ostream& out, const Date& d);friend istream& operator >> (istream& in, Date& d);Date(int y=0, int m=0, int d=0){_year = y;_month = m;_day = d;}
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;
}void test4()
{int i = 123;double d = 44.55;ostringstream oss;//序列化oss << i;string stri = oss.str();oss.str("");//清空ossoss << d;string strd = oss.str();cout << strd<< endl;oss.str("");//清空ossDate d1(2022, 10, 11);oss << d1;string strdt = oss.str();cout << strdt << endl;istringstream iss(strdt);//反序列Date d2;iss >> d2;cout << d2 << endl;
}

image-20221021202021334

3.4 stringstream

这个对象可以用于字符串拼接,也可以用来将其他类型转为str

	stringstream sstream;// 将多个字符串放入 sstream 中sstream << "first" << " " << "string,";sstream << " second string";cout << "strResult is: " << sstream.str() << endl;// 清空 sstreamsstream.str("");sstream << "third string";cout << endl;cout << "After clear, strResult is: " << sstream.str() << endl;

image-20221021202846449

3.5使用stringstream的注意事项

  • stringstream实现转换,实际上是维护了一个string对象实现的

  • 我们可以使用str("")清空里面的string对象,设置为空字符串

  • 多次数据类型转换的时候,需要用clear()来清空,才能正确转换。不过clear()不会清空底层的string对象

  • 因为使用的是string对象,所以使用的时候不需要格式化控制,可以自动推导类型

stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit
因此下一次转换是必须调用clear()将状态重置为goodbit才可以继续转换

image-20221021203337884

这里在第一次调用stringstream操作后,我们没有进行clear,会发现后续的double类型转换失败了

image-20221021203409171

执行了clear之后,转换成功!

结语

关于C++IO流操作的基本认识到这里就over了。

因为在实际中用的并不算多,所以这部分的内容大多数是了解一二,知道如何使用,以及3.0中提到的按位与操作是怎么实现的就OK了!

相关文章:

【C++】文件IO流

一起来康康C中的文件IO操作吧 文章目录1.operator bool2.C文件IO流3.文件操作3.0 关于按位与的说明3.1 ifstream3.2 ofstream流插入文本3.3 ostringstream/istringstream3.4 stringstream3.5使用stringstream的注意事项结语1.operator bool 之前写OJ的时候&#xff0c;就已经用…...

JavaScript高级程序设计读书分享之4章——4.2执行上下文与作用域

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 执行上下文 变量或函数的上下文决定 了它们可以访问哪些数据&#xff0c;以及它们的行为。在浏览器中&#xff0c;全局上下文就是我们常说的 window 对象&#xff08;第 12 章会详细介绍&#xff09;&am…...

函数的定义与声明

目录 1.函数的定义 2.函数声明 2.1 函数本地声明 2.2 函数外部声明 2.2.1函数的外部声明的好处和坏处 3.变量定义与声明 3.1变量定义 3.2变量声明 4.结构体的定义与声明 4.1结构体的定义 4.2结构体的声明 1.函数的定义 函数的定义即函数的具体实现。 2.函数声明 函数…...

C#部署非安装版(绿色版)mysql

C#部署非安装版&#xff08;绿色版&#xff09;mysql场景实现步骤场景 项目由bs和cs端组成&#xff0c;bs端的数据存储在了mysql中&#xff0c;cs依赖bs运行&#xff0c;bs会显示一些实时的信息。 需求是给客户一个安装包&#xff0c;简易操作就可安装完成。 使用版本&#xf…...

【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析

如果觉得我的分享有一定帮助&#xff0c;欢迎关注我的微信公众号 “码农的科研笔记”&#xff0c;了解更多我的算法和代码学习总结记录。或者点击链接扫码关注【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 【RecBole-GNN/源码】RecBole-GNN中lightGCN源码解析 原文&…...

基于UIAutomation+Python+Unittest+Beautifulreport的WindowsGUI自动化测试框架common目录解析

文章目录1 框架工具说明2 技术栈说明3 框架截图4 源码解析/common目录4.1 common/baseinfo.py4.2 common/creenShot.py4.3 common/logOut.py4.4 common/reportOut.py4.5 common/sendMail.py注&#xff1a; 1、本文为本站首发&#xff0c;他用请联系作者并注明出处&#xff0c;谢…...

c++提高篇——queque容器

一、queque容器基本概念 Queue是一种先进先出(FIFO)的教据结构&#xff0c;它有两个出口 队列容器允许从一端新增元素&#xff0c;从另一端移除元素。队列中只有队头和队尾才可以被外界使用&#xff0c;因此队列不允许有遍历行为队列中进数据。 queque容器可以形象化为生活中…...

MyBatis-XML映射文件详解

一、XML 映射器 1.概述 使用 xml 文件去配置 SQL 代码&#xff0c;比传统的 jdbc 简单方便&#xff0c;能够少写代码&#xff0c;减少使用成本&#xff0c;提高工作效率。 1.1SQL 映射文件中的顶级元素 cache – 该命名空间的缓存配置。 cache-ref – 引用其它命名空间的缓…...

基于Java+SpringBoot+Vue+Uniapp前后端分离健身预约系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《Spring家族及…...

webstom找不到vue全局组件

我真多服气&#xff0c;引入了自动组件注册 // 自动引入组建import { ElementPlusResolver } from unplugin-vue-components/resolversComponents({directoryAsNamespace: true,resolvers: [ElementPlusResolver()]}),生成了 components.d.ts 但是我在webstom中定义了标签 除非…...

ESP32设备驱动-内置霍尔磁力传感器数据读取

内置霍尔磁力传感器数据读取 文章目录 内置霍尔磁力传感器数据读取1、ESP32霍尔磁力传感器介绍2、软件准备3、硬件准备4、读取霍尔磁力传感值5、运行结果ESP32开发板具有内置霍尔效应传感器,可检测周围磁场的变化。本文将介绍如何在Arduino IDE中读取ESP32霍尔效应传感器的数据…...

2023面试准备之--mysql

文章目录mysql存储引擎索引聚簇索引和非聚簇索引事务锁MVCC机制&#xff08;类似于copy on write&#xff09;主从复制为什么要主从同步&#xff1f;怎么处理mysql的慢查询&#xff1f;mysql clint ---->server ----> 存储引擎 存储引擎 Innodb 是MySQL5.5版本及之后默…...

yolov5源码解读--训练策略

yolov5源码解读--训练策略超参数解读命令行参数train模型迭代超参数解读 hyp.scratch.yaml lr0: 0.0032 初始学习率 lrf: 0.12 使用余弦函数动态降低学习率(lr0*lrf) momentum: 0.843 动量 weight_decay: 0.00036 权重衰减项 warmup_epochs: 2.0 预热&#xff08;…...

基于Django的员工管理系统

目录 一、新建项目 二、创建app 三、设计表结构 四、在MySQL中生成表 五、静态文件管理 六、添加页面 七、模板的继承 一、新建项目 django-admin startproject 员工管理系统 二、创建app startapp app01 三、设计表结构 app01/migrations/models.py from django.db impo…...

企业数智化转型在即,看看低代码软件公司如何做!

在信息爆炸的现代社会中&#xff0c;利用先进技术为企业提升办公协作效率&#xff0c;是一件事半功倍的事。当前&#xff0c;数字化转型升级已经是发展趋势&#xff0c;不少企业已经在朝着数智化转型方向迈进。作为一家低代码软件公司&#xff0c;流辰信息看到了市场发展前景&a…...

如何将pdf版的文书文字提取出来?

//在线工具地址https://ocr.bytedance.zj.cn/image/ImageText在当今信息爆炸的时代&#xff0c;图文并茂已经成为了一个广告宣传的常用方式。然而&#xff0c;图片中的文字信息往往难以获取&#xff0c;尤其对于那些需要快速获取信息的人们来说&#xff0c;阅读图片中的文字会是…...

设计模式——工厂模式

工厂模式 1.需求 抽奖活动 新用户注册即参与抽奖&#xff0c;奖品为&#xff1a;1.优惠券&#xff0c;2.优酷会员&#xff0c;3.京东卡 2.无模式 public class FreeGoodsController{public Result<?> send(AwardInfo awardInfo){int awardType awardInfo.getAward…...

PCB设计中降低噪声与电磁干扰的24个窍门

电子设备的灵敏度越来越高&#xff0c;这要求设备的抗干扰能力也越来越强&#xff0c;因此PCB设计也变得更加困难&#xff0c;如何提高PCB的抗干扰能力成为众多工程师们关注的重点问题之一。本文将介绍PCB设计中降低噪声与电磁干扰的一些小窍门。 下面是经过多年设计总结出来的…...

设计模式浅谈

什么是设计模式 设计模式是一种软件设计的思想。是在软件开发过程中&#xff0c;经过验证的、用于解决在特定环境下重复出现的、特定问题的解决方案。 设计模式的设计原则 原文链接&#xff1a;https://blog.csdn.net/qq_43471489/article/details/124067150 设计原则 1、…...

【kubernetes】使用crictl对k8s节点进行调试

crictl 是 CRI 兼容的容器运行时命令行接口,可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。 可以Github上下载最新的发布版本: https://github.com/kubernetes-sigs/cri-tools/releases 包名大小发布日期...

数字经济讨论题

自2001年以来&#xff0c;Alphabet&#xff08;Google&#xff09;已进行了200多次并购。下面列出了并购年份。选择Alphabet进行的三笔并购讨论这些并购是如何使Alphabet拥有新的或增强的现有业务领域重要的是考虑何时进行所选择的收购。谷歌已经从一家提供互联网搜索引擎的公司…...

gcc/g++、动静态库、make/makefile

目录 gcc/g gcc和g的对比 "一段代码的使命" ●预处理 ●编译 ●汇编 ●链接 ●动/静态链接 make/makefile gcc/g gcc和g的对比 对于c文件而言&#xff0c;使用gcc或者g并没有什么区别。而对于cpp文件&#xff0c;在预处理、编译、汇编这三部分&#xff0c;…...

北京博奥智源,浅谈图书馆的馆情展示系统细则

功能特点&#xff1a; 1、支持智慧大屏的定制&#xff0c;内置精美的主题模板。 2、提供丰富的数据模块&#xff0c;可通过拖拽自由组合&#xff0c;配置灵活。 3、支持屏幕分辨率自定义&#xff0c;自适应屏幕大小。 4、支持背景颜色的更换&#xff0c;同时可上传图片更换背景…...

Docker----------day-mysql8主从复制

1.安装master 1.1拉取镜像 docker search mysql docker pull mysql mkdir -p /home/mysql8/data mkdir -p /home/mysql8/conf mkdir -p /home/mysql8/log1.2 2.启动交互式添加容器数据卷 #不添加容器数据卷 docker run -p 3307:3306 --name mysql_master -e MYSQL_ROOT_PASS…...

【Nginx】【一】Nginx简介

Nginx简介 背景介绍 Nginx&#xff08;“engine x”&#xff09;一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】&#xff0c;同时也是一个【POP3/SMTP/IMAP代理服务器】&#xff0c;是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的&#xff0c;Nginx的第一个版本是200…...

跳跃游戏II-力扣45-java 动态规划

一、题目描述给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处:0 < j < nums[i] i j < n返回到达 nums[n - …...

【算法】用python代码解决“鬼谷问徒”问题

文章目录题目相关链接算法代码代码可优化的点喜欢这种搞逻辑的题目。据说chatGPT暂时还不会写hhh。水平有限&#xff0c;我自己花了两个小时才实现&#xff0c;不过解决问题的过程还是很快乐的。题目 一天&#xff0c;鬼谷子随意从2-99中选取了两个数。他把这两个数的和告诉了…...

【1】linux命令每日分享——mkdir创建目录

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…...

TPM 2.0实例探索1

1. 获取用户名 命令及结果如下所示&#xff1a; $ whoami ph2. 获取设备序列号&#xff08;串号&#xff09; 命令及结果如下所示&#xff1a; $ sudo dmidecode | grep "Serial Number" | head -n 1Serial Number: MP260S483. 将用户名和设备序列号放入到一个文…...

buu [BJDCTF2020]signin 1

题目描述&#xff1a; 题目分析&#xff1a; 打开发现是16 进制数&#xff08;我也不知道我是怎么发现的&#xff0c;先是尝试了md5和rot-n,发现都不行&#xff0c;然后参考大佬的才知道是16进制&#xff09;使用 在线16进制转字符串 便能得到 flag但我如果不想用线上工具&…...