《c++ primer笔记》第八章 IO库
前言
简单看一下就行
文章目录
- 一、IO类
- 1.1基本概念
- 1.2管理输出缓冲
- 二、文件输入输出
- 2.1文件模式
- 三、string流
- 3.1istringstream
- 3.2ostringstream
一、IO类
1.1基本概念
我们常见的流有istream和ostream,这两个流都是有关输入和输出的,此外,下标列举了一些其它的IO类型。fstream定义了读写命名文件的类型,sstream定义了读写内存string对象的类型。

不同IO类型之间虽然存在着差异,但是我们在使用时完全可以忽略。可以用>>读取数据,不管是从控制台窗口用户的输入、磁盘文件中读入还是读取一个字符串。标准库通过继承机制,忽略了这些差异(这部分在15章和18章有谈到,感觉这种知识点目前阶段可以不用去深究,知道怎么用就行)。
IO对象没有拷贝或赋值
IO对象不能对其进行拷贝或者赋值,所有我们在编写函数时,不能将其作为形参或者返回类型。通常进行IO操作的函数以引用的方式传递和返回流。
IO操作的条件状态
书上列举很多使用IO操作时可能出现的条件状态,可以把它们理解为一个报错信息提醒。比如定义了一个整型变量,输入的确实一个字符串,这时就会出现IO操作失败的信息,一旦一个流发生错误,其后面跟着的IO操作都会失败。

确定一个流对象的状态的最简单的方法是将它当做一个条件来使用。
while (cin >> word)
如果我们要查询一个流的具体状态,可以通过iostate类型,它里面有4个constexpr值:badbit表示系统级错误,流无法再使用,比如不可恢复的读写错误;failbit就是上面提到了输入类型不匹配,这种情况是可以修正的,流可以继续使用;eofbit表示文件结束位置,这时failbit也会被置位;goodbit值为0表示流未发生错误。
1.2管理输出缓冲
每个输出流都管理一个缓冲区,用来保存程序读写的数据。缓冲区机制可以让操作系统将程序的多个输出操作组合成单一的系统级写操作。
刷新输出缓冲区
导致缓冲区刷新的条件有很多,如下:
- 程序正常结束,作为main函数的
return操作的一部分 - 缓冲区满时,需要刷新才能写入新的数据
- 使用
endl显式刷新缓冲区,还有flush和ends都可以刷新缓冲区 - 每个输出操作之后,可以使用操纵符
unitbuf设置流的内部状态,来清空缓冲区(使用该操作会在输出后立即刷新缓冲区,适用于程序之后的所有输出,可以通过设置nounitbuf重置回到正常的缓冲方式) - 两个关联的流在其中一个被读写时,另一个流的缓冲区会被刷新。比如
cin和cerr都关联到cout,当读cin或者写cerr都会导致cout的缓冲区刷新(可以通过tie构建两个流之间的映射关系)
二、文件输入输出

当要读写一个文件时,可以定义个文件流对象,并将对象与文件关联起来。每个文件流类都定义了一个名为open的成员函数。
ifstream in(file); // 传入一个文件,open函数会被自动调用
in.close(); // 同样的,当我们销毁一个fstream对象时,close会自动被调用
2.1文件模式
每个流都有一个关联的文件模式。

对于上面的模式对流有一定的限制:
- 只可以对
ofstream或fstream对象设定out模式 - 只可以对
ifstream或fstream对象设定in模式 - 只有当
out被设定时才可以使用trunc模式。(即使没有指定trunc,以out模式打开的文件也会被截断) - 只要
truc模式没被设定,就可以设定app模式。在app模式下。即使没有显式指定out模式,文件也总是以输出方式打开
每个文件流类型都定义了一个默认的文件模式,ifstream默认以in模式打开,ofstream默认以out打开,fstream默认以in和out打开。
在只使用out时,打开的文件的内容会被清空,所以需要加上app模式把新的内容添加到文件末尾。
三、string流

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;elsecerr << "Input error:" << entry.name << " invalid number(s) " << badNums.str() << endl;
}
相关文章:
《c++ primer笔记》第八章 IO库
前言 简单看一下就行 文章目录一、IO类1.1基本概念1.2管理输出缓冲二、文件输入输出2.1文件模式三、string流3.1istringstream3.2ostringstream一、IO类 1.1基本概念 我们常见的流有istream和ostream,这两个流都是有关输入和输出的,此外,…...
web开发 用idea创建一个新项目
这个写着就是给自己当备忘录用的QAQ 这个老师上课一通操作啥也没看清…卑微搞了半天看样子是成功了 记录一下省的以后忘了怎么创建(? zufe lxy 2023.3 先行条件是已经自己装好了Tomcat和idea!!(我的idea是申请了教育…...
【FMCW 03】测速
从上一讲 测距 末尾的frame讲起。我们知道一个chirp对应了一个采样后的IF信号,我们将这些采样后的IF信号按chirp的次序排列成一个帧(frame),这就得到了我们实际中接收后处理的FMCW信号。 由于chirp的发射返回时间很短,…...
ERP(企业资源管理)概述
🌟所属专栏:ERP企业资源管理🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新ERP的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简介&a…...
深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制
深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制性能监控和故障处理工具、类加载机制jpsjstatjinfojmapjhatjstackVisualVM类加载机制类加载的时机类加载的过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型破坏双亲委派模型往期内容&am…...
推荐系统与推荐算法
文章目录第一章1.1推荐系统意义与价值1.2推荐系统历史与框架1.3推荐算法分类第二章2.1协同过滤的基本思想与分类2.2基于用户的协同过滤2.3基于项目的协同过滤2.4基于邻域的评分预测2.5基于二部图的协同过滤第三章3.1基于关联规则的推荐3.2基于矩阵分解的评分预测3.3概率矩阵分解…...
socket 编程实战(编写客户端程序 )
编写客户端程序 接着上一篇:实战服务端程序 接下来我们再编写一个简单地客户端应用程序,客户端的功能是连接上小节所实现的服务器,连接成功之后向服务器发送数据,发送的数据由用户输入。示例代码如下所示: #include…...
“巨亏成名”的魔鬼交易员,你知道几个?
谁说在期货市场上只有赚大钱才能出名?殊不知还有这样一群特殊的交易员靠着巨额亏损而“一战成名”,亏得是老东家元气大伤,外号“魔鬼交易员”——“不亏不成魔”!接下来火象就给大家盘点几位代表性魔鬼交易员,看看他们…...
1380:分糖果(candy)
1380:分糖果(candy) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 童年的我们,将和朋友分享美好的事物作为自己的快乐。这天,C小朋友得到了Plenty of candies,将要把这些糖果分给要好的朋友们。已知糖果从一个人传…...
数据挖掘(2.1)--数据预处理
一、基础知识 1.数据的基本概念 1.1基础知识 数据是数据对象(Data Objects)及其属性(Attributes)的集合。 数据对象(一条记录、一个实体、一个案例、一个样本等)是对一个事物或者物理对象的描述。 数据对象的属性则是这个对象的性质或特征,例如一个人的肤色、眼球…...
PMP考前冲刺3.06 | 2023新征程,一举拿证
题目1-2:1.一名团队成员表示,他们的用户故事要等到迭代结束后才能完成,因为他们的职能经理要求他们协助解决高优先级的生产问题。项目经理应该做什么?A.将问题上报给项目发起人以解决和调整项目燃尽图B.与产品负责人讨论用户故事不…...
buuctf-pwn write-ups (11)
文章目录buu083-x_ctf_b0verfl0wbuu084-picoctf_2018_leak_mebuu085-inndy_echobuu086-hitcontraining_unlinkbuu087-ciscn_2019_final_3buu088-axb_2019_fmt64buu089-wustctf2020_name_your_catbuu090-pwnme1buu091-axb_2019_brop64buu092-[极客大挑战 2019]Not Badbuu083-x_c…...
【VTK】VTK隐藏vtkOutputWindow窗口的正确方法
VTK隐藏vtkOutputWindow窗口 要求隐藏vtkOutputWindow窗口,但是不能把Warning警告和Error错误的信息都给屏蔽了 网上常见的错误方法: 现在百度搜索出来的方法几乎都是在这样做:在main文件中使用vtkOutputWindow::SetGlobalWarningDisplay(0…...
顺序表以及链表的应用及区别(包含OJ讲解)
前面我已经发过怎么实现链表以及顺序表,今天大概的总结一下。 顺序表: 1.能够随时的存取,比较方便。 2.插入删除时,需要挪动数据,比较麻烦,因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…...
JVM简介
一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平…...
Leetcode.1653 使字符串平衡的最少删除次数
题目链接 Leetcode.1653 使字符串平衡的最少删除次数 Rating : 1794 题目描述 给你一个字符串 s,它仅包含字符 a和 b 。 你可以删除 s中任意数目的字符,使得 s平衡 。当不存在下标对 (i,j)满足 i < j,且 s[i] b的同…...
leetcode 71~80 学习经历
leetcode 71~80 学习经历71. 简化路径72. 编辑距离73. 矩阵置零74. 搜索二维矩阵75. 颜色分类76. 最小覆盖子串77. 组合78. 子集79. 单词搜索80. 删除有序数组中的重复项 II小结71. 简化路径 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 &am…...
使用metrics-server监控k8s的资源指标
首先,欢迎使用DHorse部署k8s应用。 k8s可以通过top命令来查询pod和node的资源使用情况,如果直接运行该命令,如下所示。 [rootcentos05 deployment]# kubectl top pod W0306 15:23:24.990550 8247 top_pod.go:140] Using json format to …...
【Copula】考虑风光联合出力和相关性的Copula场景生成(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
【java基础】泛型程序设计基础
文章目录泛型是什么自定义泛型类自定义泛型方法类型变量的限定总结泛型是什么 泛型类和泛型方法有类型参数,这使得它们可以准确地描述用特定类型实例化时会发生什么。在没有泛型类之前,程序员必须使用Objct编写适用于多种类型的代码。这很烦琐ÿ…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
