C++primer第八章 IO库 8.3string流

8.3string流

  • sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。
  • istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream既可从string读数据也可向string写数据。与fstream类型类似,头文件sstream中定义的类型都继承自我们已经使用过的iostream头文件定义的类型。除了继承得来的操作,sstream中定义的类型还增加了一些成员来管理与流相关联的stringo表8.5列出了这些操作,可以对stringstream对象调用这些操作,但不能对其他IO类型调用这些操作。

8.3.1 使用 istringstream

  • 当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用istringstream。
  • 考虑这样一个例子,假定有一个文件,列出了一些人和他们的电话号码。某些人只有一个号码,而另一些人则有多个-- 家庭电话、工作电话、移动电话等。我们的输入文件看起来可能是这样的:morgan 2015552368 8625550123 drew 9735550130 lee 6095550132 2015550175 8005550000
  • 文件中每条记录都以一个人名开始,后面跟随一个或多个电话号码。我们首先定义一个简单的类来描述输入数据:
    / / 成员默认为公有;参见 7.2节 (第 240页 )struct Personinfo ( string name; vector<string> phones;};类型Personinfo的对象会有一个成员来表示人名,还有一个vector来保存此人的所 有电话号码。
  •  我们的程序会读取数据文件,并创建一个Personinfo的vectoro vector中每个元素对应文件中的一条记录。我们在一个循环中处理输入数据,每个循环步读取一条记录,提取出一个人名和若干电话号码:
    struct PersonInfo{std::string name;std::vector<std::string> phones;};std::string line,word;//分别来自输入的一行和单词
std::vector<PersonInfo> people;//保存来自输入的所有记录while (std::getline(std::cin,line)){PersonInfo info;//创建一个保存此记录数据的对象std::istringstream record(line);//将记录绑定到刚刚读入的行record >> info.name;//读取名字while (record >> word){info.phones.push_back(word);//保持他们}people.push_back(info);//将记录追加到people的末尾}
  • 这里我们用getline从标准输入读取整条记录。如果 getline调用成功,那 么 line 中将保存着从输入文件而来的一条记录。在 while中,我们定义了一个局部Personlnfo对象,来保存当前记录中的数据。接下来我们将一个istringstream与刚刚读取的文本行进行绑定,这样就可以在 此 istringstream上使用输入运算符来读取当前记录中的每个元素。我们首先读取人 名,随后用一个while循环读取此人的电话号码。 当读取完line中所有数据后,内层while循环就结束了。此循环的工作方式与前 面章节中读取cin的循环很相似,不同之处是,此循环从一个string而不是标准输入 读取数据。当 string中的数据全部读出后,同样会触发“文件结束”信号,在 record 上的下一个输入操作会失败。
  • 我们将刚刚处理好的Personinfo追加到vector中,外层while循环的一个循环 步就随之结束了。外层while循环会持续执行,直至遇到cin的文件结束标识。

8.3.2使用ostringstream

  • 当我们逐步构造输出,希望最后一起打印时,ostringstream是很有用的。例如,对上一节的例子,我们可能想逐个验证电话号码并改变其格式。如果所有号码都是有效的,我们希望输出一个新的文件,包含改变格式后的号码。对于那些无效的号码,我们不会将它们输出到新文件中,而是打印一条包含人名和无效号码的错误信息。
  • 由于我们不希望输出有无效电话号码的人,因此对每个人,直到验证完所有电话号码后才可以进行输出操作。但是,我们可以先将输出内容“写入”到一个内存ostringstream中:
  • 在此程序中,我们假定已有两个函数,valid和format,分别完成电话号码验证和改变格式的功能。程序最有趣的部分是对字符串流formatted和badNums的使用。我们使用标准的输出运算符(<<)向这些对象写入数据,但这些“写入操作实际上转换为string操作,分别向formatted和badNums中的string对象添加字符。

C++使用标准库类来处理面向流的输入和输出:

  • iostream处理控制台IO
  • fstream处理命名文件IO
  • stringstream完成内存string的IO
  • 类fstream和stringstream都是继承自类iostream的。输入类都继承自istream,输出类都继承自ostream。因此,可以在istream对象上执行的操作,也可在ifstream或istringstream对象上执行。继承自ostream的输出类也有类似情况。
  • 每个IO对象都维护一组条件状态,用来指出此对象上是否可以进行IO操作。如果遇到了错误--例如在输入流上遇到了文件末尾,则对象的状态变为失效,所有后续输入操作都不能执行,直至错误被纠正。标准库提供了一组函数,用来设置和检测这些状态。

术语表

  • 条件状态(conditionstate)可被任何流类使用的一组标志和函数,用来指出给定流是否可用。
  • 文件模式(filemode)类fstream定义的一组标志,在打开文件时指定,用来控制文件如何被使用。
  • 文件流(filestream)用来读写命名文件的流对象。除了普通的iostream操作,文件流还定义了open和close成员。成员函数open接受一个string或一个C风格字符串参数,指定要打开的文件名,它还可以接受一个可选的参数,指明文件打开模式。成员函数close关闭流所关联的文件,调用close后才可以调用open打开另一个文件
  • fstream用于同时读写一个相同文件的文件流。默认情况下,fstream以in和out模式打开文件。
  • ifstream用于从输入文件读取数据的文件流。默认情况下,ifstream以in模式打开文件。
  • 继承(inheritance)程序设计功能,令一个类型可以从另一个类型继承接口。类ifstream和istringstream继承自istream,ofstream和ostringstream继承自ostream。第15章将介绍继承
  • istringstream用来从给定string读取数据的字符串流。
  • ofstream用来向输出文件写入数据的文件流。默认情况下,ofstream以out模式打开文件
  • 字符串流(stringstream)用于读写string的流对象。除了普通的iostream操作外,字符串流还定义了一个名为str的重载成员。调用str的无参版本会返回字符串流关联的string。调用时传递给它一个string参数,则会将字符串流与该string的一个拷贝相关联。
  • stringstream用于读写给定string的字符串流。

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

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

相关文章

英语口语海报演讲--东软

海报 海报上的内容 Nuclear waste water 1.Damage the devastating impact of nuclear radiation on the world 2.Marine life genetically mutated or dead 3.water resources polluted water resources 4.the future of humanity genetic damage/food and environment destr…

C++primer第九章 顺序容器 9.1 顺序容器概述 9.2容器库概览

一个容器就是一些特定类型对象的集合。顺序容器(sequentialcontainer)为程序员提供了控制元素存储和访问顺序的能力。这种顺序不依赖于元素的值&#xff0c;而是与元素加入容器时的位置相对应。与之相对的&#xff0c;我们将在第11章介绍的有序和无序关联容器&#xff0c;则根据…

C++primer第九章 顺序容器 9.3 顺序容器操作

9.3顺序容器操作 顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到了元素如何存储、访问、添加以及删除。上一节介绍了所有容器都支持的操作&#xff08;罗列于表9.2&#xff08;第295页&#xff09;&#xff09;。本章剩余部分将介绍顺序容器所特…

C++primer第九章 顺序容器 9.4 vector对象是如何增长的

为了支持快速随机访问&#xff0c;vector将元素连续存储&#xff0c;每个元素紧挨着前一个元素存储。通常情况下&#xff0c;我们不必关心一个标准库类型是如何实现的&#xff0c;而只需关心它如何使用。然而&#xff0c;对于vector和string,其部分实现渗透到了接口中。假定容器…

C++primer第九章 顺序容器 9.5 额外的string操作

除了顺序容器共同的操作之外&#xff0c;string类型还提供了一些额外的操作。这些操作中 的大部分要么是提供string类和C 风格字符数组之间的相互转换,要么是增加了允许我们用下标代替迭代器的版本。标准库string类型定义了大量函数。幸运的是&#xff0c;这些函数使用了重复的…

Zookeeper Mac下安装操作

目录一、下载Zookeeper二、修改配置1、设置启动配置文件2、修改配置三、启动Zookeeper服务命令1、bin目录下执行&#xff08;1&#xff09;启动Zookeeper命令&#xff08;2&#xff09;查看Zookeeper状态命令&#xff08;3&#xff09;停止Zookeeper命令2、配置环境变量执行&am…

2014年考研英语二作文PartB图表题

作文详细解析 题目 Write an essay based on the following chart, in which you should interpret the chart, and give your comments You should write about 150 words on the ANSWER SHEET.(15 points) 注意点 1.图表题在第一段描述图表信息时,一定要写清楚y轴变化…

C++primer第九章 顺序容器 9.6 容器适配器

9.6容器适配器 除了顺序容器外&#xff0c;标准库还定义了三个顺序容器适配器&#xff1a;stack、queue和priority_queue适配器(adaptor)是标准库中的一个通用概念。容器、迭代器和函数<369I都有适配器。本质上&#xff0c;一个适配器是一种机制&#xff0c;能使某种事物的…

SpringBoot Controller接收参数的常用方式

文章目录一、请求路径参数1、PathVariable二、Body参数1、RequestParam2、RequestBody三、请求头参数和Cookie参数1、RequestHeader2、CookieValue一、请求路径参数 1、PathVariable 注解为&#xff1a; org.springframework.web.bind.annotation.PathVariable获取路径参数&…

C++primer第十章 泛型算法 10.1 概述 10.2 初识泛型算法

大多数算法都定义在头文件algorithm中。标准库还在头文件numeric中定义了 一组数值泛型算法一般情况下&#xff0c;这些算法并不直接操作容器&#xff0c;而是遍历由两个迭代器指定的一个元素范围(参见9.2.1节&#xff0c;第296页)来进行操作。通常情况下&#xff0c;算法遍历范…

MySQL Mac安装教程

文章目录一、下载安装包二、安装三、启动MySQL四、环境变量设置一、下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 二、安装 双击安装包&#xff0c;然后一直点继续即可。 三、启动MySQL 打开 系统偏好设置&#xff0c;会发现多了一个…

C++生成指定范围内的随机数

代码 rand&#xff08;&#xff09;% 3 &#xff1b; 3就是范围&#xff0c;代表生成[0,3)之间的随机数 int main(){for (int i 0; i < 20; i) {switch (rand() % 3) {case 0:std::cout << "00" << std::endl;case 1:std::cout << "11&q…

C++primer第十章 泛型算法 10.3 定制操作

10.3定制操作 很多算法都会比较输入序列中的元素。默认情况下&#xff0c;这类算法使用元素类型的&#xff1c;或运算符完成比较。标准库还为这些算法定义了额外的版本&#xff0c;允许我们提供自己定义的操作来代替默认运算符。例如&#xff0c;sort算法默认使用元素类型的&l…

C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构

除了为每个容器定义的迭代器之外&#xff0c;标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。插入迭代器(insert iterator)&#xff1a;这些迭代器被绑定到一个容器上&#xff0c;可用来向容器插入元素。流迭代器(stream iterator)&#xff1a;这些…

C++primer第十一章 关联容器 11.1使用关联容器 11.2 关联容器概述

关联容器和顺序容器有着根本的不同&#xff1a;关联容器中的元素是按关键字来保存和访问的。与之相对&#xff0c;顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。虽然关联容器的很多行为与顺序容器相同&#xff0c;但其不同之处反映了关键字的作用关联容器支持高…

Redis Mac下安装与使用

目录一、下载安装包二、编译三、服务端与客户端命令1、服务端启动命令2、客户端连接命令3、服务端关闭命令一、下载安装包 官网地址&#xff1a;http://redis.io/download 下载后&#xff0c;解压放到任意目录下。 二、编译 打开终端&#xff0c;切换到 Redis 根目录&#x…

C++primer第十一章 关联容器 11.3关联容器操作 11.4 无序容器

11.3关联容器操作 除了表9.2(第295页)中列出的类型&#xff0c;关联容器还定义了表11.3中列出的类型。这些类型表示容器关键字和值的类型。对于set类型&#xff0c;key_type和value type是一样的&#xff1b;set中保存的值就是关键字。在一个map中&#xff0c;元素是关键字_值…

SpringBoot 整合Dubbo

文章目录一、工程目录结构二、创建工程项目1、创建接口工程&#xff08;cw-dubbo-api&#xff09;&#xff08;1&#xff09;pom.xml&#xff08;2&#xff09;创建接口类&#xff08;LoginService&#xff09;2、创建服务提供者工程&#xff08;cw-dubbo-provider&#xff09;…

C++primer第一章 开始

运算符打印endl,这是一个被称为操纵符(manipulator)的特殊值。写入endl 的效果是结束当前行&#xff0c;并将与设备关联的缓冲区(buffer)中的内容刷到设备中。缓冲刷新操作可以保证到目前为止程序所产生的所有输出都真正写入输出流中&#xff0c;而不是仅停留在内存中等待写入流…

硬盘 相关知识

磁盘存储数据于轨道上&#xff0c;为了防止数据不被干扰&#xff0c;轨道之间是存在间隙的。如果间隙越小存储的数据越多&#xff0c;但是对数据的写入和读取所使用的磁头是不一样的&#xff0c;写入的磁头比较宽&#xff0c;读取的磁头比较窄。叠瓦式硬盘&#xff0c;将轨道和…