C++(8):IO 库

news2024/11/17 7:36:57

IO 类

IO 库类型和头文件
在这里插入图片描述
iostream 定义了用于读写流的基本类型,fstream 定义了读写命名文件的类型,sstream 定义了读写内存 string 对象的类型。
其中带 w 前缀的类型用来操作宽字符语言 (wchar_t)。宽字符版本的类型和函数前都有一个 w,如 wcin, wcout, wcerr。

可以将一个派生类(继承类)对象当成基类(所继承的类)对象来使用。

IO对象无拷贝或赋值

ofstream out1,out2;
out1 =out2;//错误:不能对流对象赋值
ofstream print(ofstream);//错误:不能初始化ofstream参数
out2 = print(out2);//错误:不能拷贝流对象

不能拷贝或对 IO 对象赋值,因此也不能将形参或返回类型设置成流类型。
进行 IO 操作的函数通常以引用形式传递和返回流。读写 IO 对象会改变其状态,因此传递和返回的引用不能是 const 的。

条件状态

条件状态用来查看流的状态。

IO 库的状态

strm::iostate//strm是一种IO类型。iostate是一种机器相关的类型,提供了表达条件状态的完整功能。
strm::badbit//strnm::badbit用来指出流已崩溃
strn::failbit//sirm::failbit用来指出一个IO操作失败了
strm::eofbit//strm::eofbit用来指出流到达了文件结束
strm::goodbit//strm::goodbit用来指出流未处于错误状态。此值保证为零.

流的状态

//查询
s.eof()//若流s的eofbit置位,则返回true
s.fail()//若流s的failbit或badbit置位,则返回 true
s.bad()//若流s的badbit置位,则返回true
s.good()//若流s处于有效状态,则返回true
//管理
s.clear()//将流s中所有条件状态位复位,将流的状态设置为有效.返回void
s.clear(flags)//根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate。返回void
s.setstate(flags)//根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate.返回void
s.rdstate() //返回流s的当前条件状态,返回值类型为strm::iostate

管理输出缓冲

操作系统可以通过缓冲机制将程序的多个输出操作组合成单一的系统级写操作。
缓冲刷新的原因:
1.程序正常结束,作为 main 函数的 return 操作的一部分,缓冲刷新被执行;
2.缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区;
3.可以使用操纵符如 endl 来显式刷新缓冲区;
4.在每个输出操作之后,可以用操纵符 unitbuf 设置流的内部状态,来清空缓冲区。默认情况下,对 cerr是设置 unitbuf 的,因此写到 cerr 的内容都是立即刷新的,不缓冲的。
5.一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。例如,默认情况下,cin 和 cerr都关联到cout。因此,读cin或写cerr都会导致cout的缓冲区被刷新。

IO库中三个显式刷新缓冲区的操作符:

cout<< "hi!" <<endl;//输出hi和一个换行,然后刷新缓冲区
cout<< "hi!" <<flush;//输出hi,然后刷新缓冲区,不附加任何额外字符
cout<< "hi!" <<ends;//输出hi和一个空字符,然后刷新缓冲区

unitbuf 操作符:告诉流在接下来的每次写操作之后进行一次 flush 操作。
nounitbuf 操作符:重置流,使其恢复使用正常的系统管理的缓冲区刷新机制。

cout << unitbuf;//所有输出操作后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout << nounitbuf;//回到正常的缓冲方式

如果程序崩溃,输出缓冲区不会被刷新,即此时相应的输出操作已执行但没有打印。

当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。

// cout 和 cin 关联在一起
cin >> ival;//语句执行会导致 cout 的缓冲区被刷新。 

输入流的成员函数 tie 可以用来查看关联的输出流或关联到输出流:

cin.tie(&cout);//仅仅是用来展示:标准库将 cin 和 cout 关联在一起
//old_tie指向当前关联到cin的流(如果有的话)
ostream *old_tie = cin.tie(nullptr); // cin不再与其他流关联
//将cin与cerr关联;这不是一个好主意,因为cin应该关联到cout
cin.tie(&cerr);//读取cin会刷新cerr而不是cout
cin.tie(old_tie);//重建cin和cout间的正常关联

每个流最多关联到一个输出流,但一个输出流可以被多个流关联。

文件输入输出

fstream 特有的操作:
在这里插入图片描述

使用文件流对象

//创建文件流对象时,提供了一个文件名,则 open 会自动被调用
ifstream in(ifile);//构造一个ifstream并打开给定文件
ofstream out;//输出文件流未关联到任何文件

接受一个 iostream 类型引用(或指针)参数的函数,可以用一个对应的 fstream(或 sstream)类类型来调用。

成员函数 open 和 close
如果定义了一个空文件流对象,可以随后调用 ope n来将它与文件关联起来:

ifstream in(ifile);//构筑一个ifstream并打开给定文件
ofstream out;//输出文件流未与任何文件相关联
out.open (ifile+ ".copy" );//打开指定文件

if(out)//检查 open 是否成功

一旦一个文件流已经打开,它就保持与对应文件的关联。对一个已经打开的文件流调用 open 会失败,并导致 failbit 被置位。
为了将文件流关联到另外一个文件,必须首先关闭已经关联的文件:

in.close();//关闭文件
in.open(ifile +"2");//打开另一个文件

当一个 fstream 对象被销毁时,close会自动被调用。

文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件。
在这里插入图片描述
指定文件模式的限制:
1.ifstream 默认 in 模式打开文件,ofstream 默认 out,fstream 默认 in 或 out。只可以对 ofstream 或 fstream 对象设定 out 模式。只可以对 ifstream 或 fstream 对象设定 in 模式。
2.只有当 out 也被设定时才可设定 trunc 模式,通常情况下 out 模式意味着同时使用 trunc 模式。
3.只要 trunc 没被设定,就可以设定 app 模式。在 app 模式下,即使没有显式指定 out 模式,文件也总是以输出方式被打开。
4.默认情况下,即使我们没有指定 trunc,以 out 模式打开的文件也会被截断。以 out模式打开文件会丢弃已有数据,保留被 ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式。
5.ate 和 binary 模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。

string 流

三个类型:istringstream 从 string读取数据,ostringstream向string 写入数据,而头文件 stringstream既可从 string 读数据也可向string写数据。

在这里插入图片描述

istringstream 是输入流,即读操作,要将流中的内容输入到字符串中,因此定义和使用 istringstream 时流内必须有内容,所以在使用前要提前在流内保存一个字符串。
ostringstream 是输出流,即写操作,将流中的内容输出到字符串中,ostringstream 可以在定义时即在流中保存一个字符串,也可以通过 << 操作符获得字符串。

重要术语

条件状态(condition state) 可被任何流类使用的一组标志和函数,用来指出给定流是否可用。
文件模式(file mode) 类fstream定义的一组标志,在打开文件时指定,用来控制文件如何被使用。
文件流(file stream) 用来读写命名文件的流对象。除了普通的 iostream 操作,文件流还定义了open 和 close 成员。成员函数 open 接受一个 string 或一个C风格字符串参数,指定要打开的文件名,它还可以接受一个可选的参数,指明文件打开模式。成员函数 close 关闭流所关联的文件,调用 close 后才可以调用 open 打开另一个文件。

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

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

相关文章

SAP从入门到放弃系列之PP/DS-part1

翻译一篇大佬文章&#xff0c;了解一下PPDS前世今生和产品功能出现的业务背景。虽然是15年的&#xff0c;但经典永流传~~~&#xff0c;感谢大佬的文章。 原文地址&#xff1a; #S4HANA 1610 use case series: 9a – Production Planning and Detailed Scheduling – PP/DS (b…

【MySQL学习笔记】子查询与联结(连接)

1.子查询 将一条select语句返回的结果用于另一条select语句的where子句中。 执行时&#xff0c;先执行子查询&#xff0c;再执行主查询。 select sid from sc where cid in (select cid from course where cname数据库应用技术);子查询一般与 IN 操作符结合使用&#xff0…

《微服务实战》 第三十二章 微服务链路跟踪-sleuth zipkin

前言 大型分布式微服务系统中&#xff0c;一个系统被拆分成N多个模块&#xff0c;这些模块负责不同的功能&#xff0c;组合成一套系统&#xff0c;最终可以提供丰富的功能。在这种分布式架构中&#xff0c;一次请求往往需要涉及到多个服务服务之间的调用错综复杂&#xff0c;对…

Lenovo Yoga-710-14IKB电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板Lenovo Yoga 710 (14") - 14IKB (without dGPU) 处理器Intel i5-7200U (4) 2.50GHz (IKBL)已驱动 内存48 GB ( 海盗船 DDR4 3200…

web worker创建多个 JavaScript 线程 (使用GTP写的文章)

前言 最近在优化公司的一个项目&#xff0c;使用的就是web worker去优化&#xff0c;做了那些优化&#xff0c;一个是状态的优化&#xff0c;&#xff08;通信的状态实时更新&#xff0c;以前的做法是做个定时任务实时获取它的状态&#xff0c;然后让它在页面渲染&#xff0c;这…

【Linux】 -- TCP协议 (一)

TCP协议 Tcp协议可靠性冯诺依曼体系结构 TCP的协议格式序号与确认序号窗口大小六个标志位 确认应答机制 &#xff08;ACK&#xff09;超时重传机制连接管理机制 Tcp协议 TCP全称为 “传输控制协议”&#xff08;Transmission Control Protocol&#xff09; TCP协议被广泛应用…

[linux_C语言_udp的多种实现方法及网络调试中遇到的问题]

linux_C语言_udp的多种实现方法 最基本的方式(不用组播不用sigio信号不使能广播属性)接收端发送端 使用SIGIO信号的方式(使用sigio信号使用广播使能属性)服务端客户端 使用组播模式服务端客户端 tcp和udp的使用区别调试中遇到的问题所有源码下载点这~~ 最基本的方式(不用组播不…

Unix/Linux编程:UDS 流(Stream)

〇、前言 socket 是一种 IPC &#xff08;Inter-Process Communication&#xff0c;进程间通信&#xff09;方法&#xff0c;它允许位于同一主机&#xff08;计算机&#xff09;或使用网络连接起来的不同主机上的应用程序之间交换数据。通过使用Socket&#xff0c;开发人员可以…

【C++】——栈和队列(stack、queue)及优先队列(priority_queue)的介绍和模拟实现

文章目录 1. 前言2. 容器适配器2.1 容器适配器的介绍2.2 STL标准库中stack和queue的底层结构2.3 deque的简单介绍2.4 deque的缺陷2.5 为什么选择deque作为stack和queue的底层默认容器 3. stack3.1 stack的介绍3.2 stack的使用3.3 stack模拟实现 4. queue4.1 queue的介绍4.2 que…

数据分布——长尾分布的处理

前言 长尾分布在分类任务中会提到这个名,这是因为长尾分布这个现象问题会导致在训练过程中会出现出错率高的问题&#xff0c;影响了实验结果。 这里要说的是&#xff0c;长尾分布是一种现象&#xff0c;有的地方说是一种理论或定律&#xff0c;我感觉这样说不太确切&#xff0…

取石子游戏——算法与编程

取石子游戏 目录 问题描述输入输出格式输入格式&#xff1a;输出格式&#xff1a; 输入输出样例输入样例#1&#xff1a;输出样例#1&#xff1a;提示信息 算法尼姆博奕 代码 问题描述 A l i c e Alice Alice和 B o b Bob Bob在玩取石子游戏&#xff0c;摆在他们面前的有 n n n堆…

GIS入门进阶之012

一、引言 空间数据可视化是有效传输与表达地理信息&#xff0c;挖掘空间数据之间的内在联系&#xff0c;揭示地理现象内在规律的重要手段。它通过运用地图学、计算机图形学和图像处理技术&#xff0c;将地学信息的输入、处理、查询、分析与预测的结果采用符号、图形、图像并结合…

OpenGL 材质实现

1.简介 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射&#xff0c;因而产生较小的高光点&#xf…

35岁被淘汰?软件测试工程师职业生涯规划,从技术到管理...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 入门阶段&#xf…

Parallel Desktop中按照的centos在切换root用户时,密码正确,但一直切换不成功,显示su: Authentication failure

目录 一、出现问题二、分析问题三、解决问题四、参考资料 一、出现问题 我的密码明明是输入正确的&#xff0c;但又一直给我报下面的错误 二、分析问题 我怀疑是我密码记错了&#xff0c;所以我点击Log Out&#xff0c;重新去输入了一下密码&#xff0c;发现是正确的我确认…

[学习笔记] [机器学习] 9. 朴素贝叶斯(概率基础、联合概率、条件概率、贝叶斯公式、情感分析)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 4. 说明条件概率与联合概率 5. 说明贝叶斯公式、以及特征独立的关系 6. 记忆贝叶斯公式 7. 知道拉普拉斯平滑系数 8. 应用贝叶斯公式实现概率的计算 9. 会使用朴素贝叶斯对商品评论进行情感分析 1. 朴素贝叶…

对象进阶-继承、原型-原型链

工厂方法创建对象 我们之前已经学习了如何创建一个对象&#xff0c;那我们要是想要创建多个对象又该怎么办&#xff1f;聪明的同学可能会说&#xff0c;直接在写几个对象不就好了吗&#xff1f;比如下边的代码&#xff1a; var person1 {name: "孙悟空",age: 18,s…

APP自动化测试,Appium+PO模式+Pytest框架实战—项目案例

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 PO模式&#xff1…

如何解决GEE导出影像的Nodata值在ArcGIS中无法正常显示?

目录 01 ArcGIS对于GEE掩膜影像的Nodata值的说明 02 处理方法 2.1 方法1-GEE修改掩膜值 Arguments: Returns: Image 2.2 方法2-ArcGIS重新赋值Nodata&#xff08;推荐&#xff09; 01 ArcGIS对于GEE掩膜影像的Nodata值的说明 当在GEE中进行掩膜后&#xff0c;将影像在Ar…

打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果

前期回顾 是不是在为 API 烦恼 &#xff1f;好用免费的api接口大全呼之欲出_免流接口api_彩色之外的博客-CSDN博客APi、常用框架、UI、文档—— 整理合并https://blog.csdn.net/m0_57904695/article/details/130459417?spm1001.2014.3001.5501 &#x1f44d; 本文专栏&…