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的字符串流。

C++primer第八章 IO库 8.3string流相关推荐

  1. C++primer第八章 IO库 8.1 IO类

    IO库设施 istream  (输入流)类型,提供输入操作. ostream (输出流)类型,提供输出操作. cin,-个 istream对象,从标准输入读取数据. cout, 一个ostream对象 ...

  2. c++primer 第八章 IO库

    8.1 IO类 iostream读写流,fstream读写文件,sstream读写内存string对象 宽字符(wchar_t)支持:宽字符版本的类型和函数以w开始,例如wcin,wcout,werr ...

  3. C++primer第八章 IO库 8.2 文件输入输出

    8.2文件输入输出 头文件fstream定义了三个类型来支持文件IO:ifstream从一个给定文件读取数据,ofstream向一个给定文件写入数据,以及fstream可以读写给定文件.在17.5.3 ...

  4. 《C++Primer 第五版》——第八章 IO 库

    <C++Primer 第五版>--第八章 IO 库 8.1 IO 类 IO 类型间的关系 8.1.1 IO 对象无拷贝或赋值 8.1.2 条件状态 查询流的状态 管理条件状态 8.1.3 ...

  5. 【C++ Primer | 08】IO库

    一.istringstream类 描述:从流中提取数据,支持 >> 操作 这里字符串可以包括多个单词,单词之间使用空格分开 #include <iostream> #inclu ...

  6. C++ Primer 第八章 标准IO库

    学习本章内容之前有必要对缓冲区的概念做一个基本了解,我引用了网上一片文章<C++编程对缓冲区的理解>,内容如下: 什么是缓冲区    缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内 ...

  7. C++ Primer 第八章 标准IO库(转载)

    学习本章内容之前有必要对缓冲区的概念做一个基本了解,我引用了网上一片文章<C++编程对缓冲区的理解>,内容如下: 什么是缓冲区    缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内 ...

  8. C++ Primer 5th笔记(8)chapter8 类:IO库-流的缓冲区

    1. 介绍 • 每个输出流都管理一个缓冲区,用来保存程序读写的数据 • 操作系统就可以将程序的多个输出操作组合成单一的系统级写操作(提升性能,设备的写操作很耗时) 2. 缓冲区类型:全缓冲.行缓冲和不 ...

  9. C++ Primer 5th笔记(8)chapter8 类:IO库-总览

    IO库大致可操作三类数据: 控制台流(stream) , 文件(file) , 字符串 (string). 1. eg. cin -- 一个istream对象,从标准输入读取数据 (>>, ...

最新文章

  1. 企业网络推广期间影响企业网络推广自然排名的因素有哪些?
  2. 前端小知识点(8):作者为什么设计原型
  3. 什么都没学到,记录一个鼠标监听事件吧
  4. 当MVP与阿里云一起踏上西行远征——阿里云MVP“戈壁之路”徒步记行
  5. 程序设计C++使大家容易陷入重复劳动
  6. 【Kafka】kafka SSL close message 远程主机被迫关闭了一个连接
  7. Android学习笔记之如何将数据保存到SDCard
  8. 支持HEVC格式的浏览器推荐(windows 10)
  9. 使用python实现深度神经网络--学习笔记
  10. 时间片轮转(RR)调度算法(详解版)
  11. 仿药易通输入单位信息后如果没有则自动加入功能
  12. 【Azure 应用服务】App Service 开启了私有终结点(Private Endpoint)模式后,如何来实现公网Git部署呢?
  13. <2021SC@SDUSC>【Overload游戏引擎】OvCore源码模块分析(三)——GlobalHelpers
  14. ORACLE 完美卸载
  15. IOI2017 Day1 Wiring 题解
  16. vue前端上传doc文件并读取文件内容
  17. 秒杀系统中乐观锁(Optimistic Lock)和悲观锁(Pessimistic Lock)的对比
  18. 利用python+迅雷批量下载视频
  19. Discuz!门户列表页,文章中无图片时,随机选择一张作为封面
  20. CSS学习笔记7—盒子模型

热门文章

  1. python应声虫程序_Python编程基础
  2. mac json格式化工具_一个在 MAC 上 iOS/Flutter 开发的辅助工具
  3. datareader对象直接转化为int_Integer、new Integer() 和 int 比较的面试题
  4. libc.so.6linux查找,Linux中提示:/lib64/libc.so.6: version `GLIBC_2.17' not found 的解决办法...
  5. 修改oracle默认日期,Oracle 修改默认日期格式
  6. 可以获得索引值码_搜索引擎优化最适合什么样子的工作?
  7. QStackedWidget实现自适应紧凑布局
  8. Qt Quick学习笔记
  9. cdn转发防攻击_高防CDN和高防服务器的区别?
  10. 【HDU - 5965】扫雷(dp)