《c++ primer笔记》第八章 IO库

news2024/11/15 11:13:06

前言

简单看一下就行

文章目录

    • 一、IO类
      • 1.1基本概念
      • 1.2管理输出缓冲
    • 二、文件输入输出
      • 2.1文件模式
    • 三、string流
      • 3.1istringstream
      • 3.2ostringstream

一、IO类

1.1基本概念

​ 我们常见的流有istream和ostream,这两个流都是有关输入和输出的,此外,下标列举了一些其它的IO类型fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。

image-20230306193240390

​ 不同IO类型之间虽然存在着差异,但是我们在使用时完全可以忽略。可以用>>读取数据,不管是从控制台窗口用户的输入、磁盘文件中读入还是读取一个字符串。标准库通过继承机制,忽略了这些差异(这部分在15章和18章有谈到,感觉这种知识点目前阶段可以不用去深究,知道怎么用就行)

IO对象没有拷贝或赋值

IO对象不能对其进行拷贝或者赋值,所有我们在编写函数时,不能将其作为形参或者返回类型。通常进行IO操作的函数以引用的方式传递和返回流

IO操作的条件状态

​ 书上列举很多使用IO操作时可能出现的条件状态,可以把它们理解为一个报错信息提醒。比如定义了一个整型变量,输入的确实一个字符串,这时就会出现IO操作失败的信息,一旦一个流发生错误,其后面跟着的IO操作都会失败

image-20230306194733222

确定一个流对象的状态的最简单的方法是将它当做一个条件来使用。

while (cin >> word)

如果我们要查询一个流的具体状态,可以通过iostate类型,它里面有4个constexpr值:badbit表示系统级错误,流无法再使用,比如不可恢复的读写错误;failbit就是上面提到了输入类型不匹配,这种情况是可以修正的,流可以继续使用;eofbit表示文件结束位置,这时failbit也会被置位;goodbit值为0表示流未发生错误。

1.2管理输出缓冲

​ 每个输出流都管理一个缓冲区,用来保存程序读写的数据。缓冲区机制可以让操作系统将程序的多个输出操作组合成单一的系统级写操作。

刷新输出缓冲区

​ 导致缓冲区刷新的条件有很多,如下:

  1. 程序正常结束,作为main函数的return操作的一部分
  2. 缓冲区满时,需要刷新才能写入新的数据
  3. 使用endl显式刷新缓冲区,还有flushends都可以刷新缓冲区
  4. 每个输出操作之后,可以使用操纵符unitbuf设置流的内部状态,来清空缓冲区(使用该操作会在输出后立即刷新缓冲区,适用于程序之后的所有输出,可以通过设置nounitbuf重置回到正常的缓冲方式)
  5. 两个关联的流在其中一个被读写时,另一个流的缓冲区会被刷新。比如cincerr都关联到cout,当读cin或者写cerr都会导致cout的缓冲区刷新(可以通过tie构建两个流之间的映射关系)

二、文件输入输出

image-20230306204952250

​ 当要读写一个文件时,可以定义个文件流对象,并将对象与文件关联起来。每个文件流类都定义了一个名为open的成员函数。

ifstream in(file); // 传入一个文件,open函数会被自动调用
in.close(); // 同样的,当我们销毁一个fstream对象时,close会自动被调用

2.1文件模式

​ 每个流都有一个关联的文件模式。

image-20230306205749628

对于上面的模式对流有一定的限制:

  • 只可以对ofstreamfstream对象设定out模式
  • 只可以对ifstreamfstream对象设定in模式
  • 只有当out被设定时才可以使用trunc模式。(即使没有指定trunc,以out模式打开的文件也会被截断)
  • 只要truc模式没被设定,就可以设定app模式。在app模式下。即使没有显式指定out模式,文件也总是以输出方式打开

每个文件流类型都定义了一个默认的文件模式,ifstream默认以in模式打开,ofstream默认以out打开,fstream默认以in和out打开。

​ 在只使用out时,打开的文件的内容会被清空,所以需要加上app模式把新的内容添加到文件末尾。

三、string流

image-20230306211123680

3.1istringstream

​ 处理文本或者单个单词可以使用。

struct PersonInfo {
	string name;
	vector<string> phone;
}


int main() {
	string line, word;
	vector<PersonInfo> people;
    while (getline(cin, line)) { // 读取一行输入
        PersonInfo info;
        istringstream record(line); // 把读取的输入存到istringstream流中
        record >> info.name; // 读取名字
        while (record >> word) // 读取电话号码 line中含有名字和电话号码,这里意思就是把剩余的文件,也就是电话号码,读取出来用word代替
            info.phones.push_back(word);
        people.push_back(info);
    }
}

3.2ostringstream

​ 用于输出文本等操作。比如上面我们已经读入若干人的姓名和电话号码,需要逐个验证号码的正确性并输出。

for (const auto &entry : people) { // 循环读取每个人的信息
	ostringstream formatted, badNums; // 定义两个流分别保存正确和错误信息
	for (const auto &nums : entry.phones) { // 检查号码的正确性
		if(!valid(nums)) {
			badNums << " " << nums; // 存入流
		}else {
			formatted << " " << format(nums) // 存入流
		}
	}
	...
	//打印错误的和正确的内容
	...
	
     if(badNums.str().empty())
         os << entry.name << " " << formatted.str() << endl;
    else
        cerr << "Input error:" << entry.name << " invalid number(s) " << badNums.str() << endl;
}

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

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

相关文章

如何在SSMS中生成和保存估计或实际执行计划

在引擎数据库执行查询时执行的过程的步骤由称为查询计划的一组指令描述。​查询计划在SQL Server中也称为SQL Server执行计划,我们可以通过以下步骤来生成和保存估计或实际执行计划。 估计执行计划和实际执行计划是两种执行计划: 实际执行计划:当执行查询时,实际执行计划出…

Spring之实例化Bean(2)

Spring是非常复杂的一个框架&#xff0c;想要一篇博客就说完实例化Bean的全流程&#xff0c;那将注定会是是很长很长的篇博客&#xff0c;说实话&#xff0c;换做我自己是没有耐心看完的。 本章&#xff0c;我将会以一个最简单的例子来阐述Spring实例化Bean的过程&#xff0c;…

8.SpringSecurity中的核心过滤器-CsrfFilter

SpringSecurity中的核心过滤器-CsrfFilter Spring Security除了认证授权外功能外&#xff0c;还提供了安全防护功能。本文我们来介绍下SpringSecurity中是如何阻止CSRF攻击的。 一、什么是CSRF攻击 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#…

uos 20 统信 fprintd 记录

uos 20 统信 fprintd 记录 sudo busctl deepin-authenticate.service /usr/lib/systemd/system/deepin-authenticate.service [Unit] DescriptionDeepin Authentication[Service] Typedbus BusNamecom.deepin.daemon.Authenticate ExecStart/usr/lib/deepin-authenticate/d…

Activty启动到显示的过程[二]

Activity的显示从handleResumeActivity()方法开始。 //ActivityThread.javaOverridepublic void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {final ActivityClientRecord r performResumeActivity(token, finalStat…

LCD液晶段码驱动IC/LCD液晶驱动芯片VK2C22高抗干扰/抗噪,适用于汽车仪表/单相智能电表

产品型号&#xff1a;VK2C22A/B产品品牌&#xff1a;永嘉微电/VINKA封装形式&#xff1a;LQFP52/48、DICE(COB邦定片)、COG(邦定玻璃用)产品年份&#xff1a;新年份原厂&#xff0c;工程服务&#xff0c;技术支持&#xff01;VK2C22A/B概述&#xff1a;VK2C22是一个点阵式存储映…

自然语言处理-基于预训练模型的方法-chapter3基础工具集与常用数据集

文章目录3.1NLTK工具集3.1.1常用语料库和词典资源3.1.2常见自然语言处理工具集3.2LTP工具集3.3pytorch基础3.3.1张量基本概念3.3.2张量基本运算3.3.3自动微分3.3.4调整张量形状3.3.5广播机制3.3.6索引与切片3.3.7降维与升维3.4大规模预训练模型3.1NLTK工具集 3.1.1常用语料库和…

2023年3月软考高项(信息系统项目管理师)报名走起!!!

信息系统项目管理师是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目之一&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资…

图表控件LightningChart.NET 系列教程(十一):LightningChart 组件——添加至 Blend WPF 项目

LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实时渲染的效率和效果&…

网络编程 socket 编程(一)

1. C/S 架构 C/S 架构即客户端/服务端架构&#xff0c;B/S 架构&#xff08;浏览器与服务端&#xff09;也是 C/S 架构的一种。 C/S 架构与 socket 的关系&#xff1a;学习 socket 可以完成 C/S 架构的开发。 2. osi 七层 一个完整的计算机系统由硬件、操作系统以及应用软件…

Redis:主从同步

Redis&#xff1a;主从同步一. 概述二. 原理(1) 全量同步(2) 增量同步(3) 优化Redis主从集群三. 总结一. 概述 引入&#xff1a; Redis主从集群采用一个Master负责写&#xff0c;多个Slave负责读的方式&#xff08;读多写少&#xff09;&#xff0c;那么如何让读取数据时多个从…

访问学者进入美国哪些东西不能带?

随着疫情的稳定&#xff0c;各国签证的逐步放开&#xff0c;成功申请到国外访问学者、博士后如何顺利的进入国外&#xff0c;哪些东西不能带&#xff0c;下面就随知识人网小编一起看一看。一、畜禽肉类(Meats, Livestock and Poultry)不论是新鲜的、干燥的、罐头的、真空包装的…

pycharm激活虚拟环境时报错:无法加载文件activate.ps1,因为在此系统上禁止运行脚本,Windows10系统

问题&#xff1a; ii_env\Scripts\activate : 无法加载文件 F:\gitlab\AutoFrame\ii_env\Scripts\Activate.ps1&#xff0c;因为在此系统上禁止运行脚本。 有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 所在…

34 openEuler使用LVM管理硬盘-创建并挂载文件系统

文章目录34 openEuler使用LVM管理硬盘-创建并挂载文件系统34.1 创建文件系统34.2 手动挂载文件系统34.3 自动挂载文件系统34 openEuler使用LVM管理硬盘-创建并挂载文件系统 在创建完逻辑卷之后&#xff0c;需要在逻辑卷之上创建文件系统并挂载文件系统到相应目录下。 34.1 创…

大型医院云HIS系统:采用前后端分离架构,前端由Angular语言、JavaScript开发;后端使用Java语言开发 融合B/S版电子病历系统

一套医院云his系统源码 采用前后端分离架构&#xff0c;前端由Angular语言、JavaScript开发&#xff1b;后端使用Java语言开发。融合B/S版电子病历系统&#xff0c;支持电子病历四级&#xff0c;HIS与电子病历系统均拥有自主知识产权。 文末卡片获取联系&#xff01; 基于云计…

谷歌留痕霸屏平台有哪些?

谷歌留痕霸屏平台有哪些&#xff1f; 答案是&#xff1a;光算可以做谷歌留痕霸屏 我们要先了解什么是谷歌留痕霸屏平台这个概念。 很简单&#xff0c;就是你有哪些可以做排名的网站资源&#xff0c;一般情况下你不够专业&#xff0c;是没办法把这件事做好的。 通常你要做谷…

学python的第四天---基础(2)

一、三角形类型读入数组并排序的方法nlist(map(float,input().split())) c,b,asorted(n)list_1 list(map(float, input().split())) list_1.sort() list_1.reverse()lengthssorted(map(float,input().split(" ")),reverseTrue)二、动物写法一&#xff1a;d{" &…

css系统化学习

元素的语义化 SEO:搜索引擎优化 根据搜索引擎展示的规律,语义化的元素更容易被展示获得更多浏览量 字符编码 css历史 内联样式(inline) style"内容全写在等号后面,双引号里面,多个之间用;隔开" 内部样式(internal) style写在head里面,在title下面,不是在body内, …

Hadoop集群搭建,基于3.3.4hadoop和centos8【图文教程-从零开始搭建Hadoop集群】,常见问题解决

Hadoop集群搭建&#xff0c;基于3.3.4hadoop和centos8【小白图文教程-从零开始搭建Hadoop集群】&#xff0c;常见问题解决Hadoop集群搭建&#xff0c;基于3.3.4hadoop1.虚拟机的创建1.1 第一台虚拟机的创建1.2 第一台虚拟机的安装1.3 第一台虚拟机的网络配置1.3.1 主机名和IP映…

10.单点登录原理及JWT实现

单点登录原理及JWT实现 一、单点登录效果 首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso?_fromgitee_search 把案例代码直接导入到IDEA中 然后分别修改下server和samples中的配置信息 在host文件中配置 …