sstream 头文件定义了三个类型来支持内存 IO,这些类型可以向 string 写入数据,从 string 读取数据,就像 string 是一个 IO 流一样。

istringstream 从 string 读取数据,ostringstream 向 string 写入数据,stringstream 既可以从 string 读取数据也可以向 string 写入数据。类似于 fstream,sstream 中定义的类型也都是继承自 iostream 中的类型。除了继承来的操作,sstream 中定义的类型还增加了一些成员来管理与流相关的 string。可以对 stringstream 对象调用这些操作,但不能对其他 IO 类型调用这些操作:

     sstream strm;//strm是一个未绑定的stringstream对象.sstream是头文件sstream中定义的一个类型
sstream strm1(s);//strm是一个sstream对像,保存string s的一个拷贝.此构造函数是explicit的
strm.str();//返回strm所保存的string拷贝
strm.str(s);//将string s拷贝到strm中.返沪void

使用 istringstream:

假定有一个文件,列出了一些人和它们的电话号码。某些人只有一个号码,而另一些人则有多个——家庭电话,工作电话,移动电话等。我们输入的文件可能是:

morgan 2017347 72849289

jfsl 7823434

jfkds 7384534 58349578 59308509

每条记录都以一个人名开始,后面跟着一个或多个电话号码。我们首先定义一个简单的类来描述输入数据:

 //成员默认为共有
struct person_info{
string name;//存储人名
std::vector<string> phones;//存储电话号码
};
 #include <iostream>
#include <sstream>
#include <vector>
using namespace std; //成员默认为共有
struct person_info{
string name;//存储人名
std::vector<string> phones;//存储电话号码
void print(void) const{
cout << name;
for(const auto p : phones){
cout << " " << p;
}
cout << endl;
}
}; int main(void){
string line, word;//分别保存来自输入的一行和单词
std::vector<person_info> people;//保存来自输入的所有记录 while(getline(cin, line)){
person_info info;//创建一个保存此记录的数据对象
istringstream record(line);//将记录绑定到刚读入的行
record >> info.name;
while(record >> word){
info.phones.push_back(word);
}
people.push_back(info);//将此记录追加到people末尾
// info.print();
} for(const auto info : people){
info.print();
}
return ;
}

使用 ostringstream:

当我们逐步构造输出,希望最后一起打印时,ostringstream 是很有用的。如:在上一个例子中,我们可能像逐个验证电话号码并改变其格式。如果所有号码都是有效的,我们希望输出一个新的文件,包含改变格式后的号码。对于那些无效号码,我们不会将它们输出到新文件中,而是打印一条包含人名和无效号码的错误信息。

由于我们不希望输出有无效号码的人,因此对于每个人,知道验证完所有电话号码后才可以进行输出操作。但是我们可以先将输出内容 "写入" 到一个内存 ostringstream 中:

 #include <iostream>
#include <sstream>
#include <vector>
using namespace std; //成员默认为共有
struct person_info{
string name;//存储人名
std::vector<string> phones;//存储电话号码
void print(void) const{
cout << name;
for(const auto p : phones){
cout << " " << p;
}
cout << endl;
}
}; bool valid(const string &s){ } bool format(const string &s){ } int main(void){
string line, word;//分别保存来自输入的一行和单词
std::vector<person_info> people;//保存来自输入的所有记录 while(getline(cin, line)){
person_info info;//创建一个保存此记录的数据对象
istringstream record(line);//将记录绑定到刚读入的行
record >> info.name;
while(record >> word){
info.phones.push_back(word);
}
people.push_back(info);//将此记录追加到people末尾
// info.print();
} for(const auto &entry : people){
ostringstream formatted, bad_nums;
for(const auto &nums : entry.phones){
if(!valid(nums)) bad_nums << " " << nums;
else formatted << " " << format(nums);
}
if(bad_nums.str().empty()) cout << entry.name << " " << formatted.str() << endl;
else cout << "input error: " << entry.name << " invalid number(s) " << bad_nums.str() << endl;
}
return ;
}

sstream 通常用于格式转换:

http://blog.csdn.net/xiaogugood/article/details/21447431

IO相关3(string流)的更多相关文章

  1. IO库----IO类,文件输入输出,string流

    一.IO类 1.IO库类型和头文件表: 头文件 类型 iostream istream,wistream 从流读取数据 ostream,wostream 向流写入数据 iostream,wiostre ...

  2. Properties -IO相关的双列集合类

    IO相关的集合类 java.util.Properties集合 extends hashtable(淘汰) Properties类表示了一个持久的属性集.Properties可保存流中或从流中加载 P ...

  3. Java IO相关使用

    date: 2020-06-14 14:42:22 updated: 2020-08-21 17:35:45 Java IO相关使用 1. 文件 创建 File 对象的三种方式 一个路径名:File( ...

  4. 文件IO 相关的包:java.io文件——API

    文件IO 相关的包:java.io文件——API 1.Java.io.File类的使用(1)两种路径绝对路径:相对于当前路径:当前为 “工程名”(2)File类创建,对象为一个文件/目录,可能存在或不 ...

  5. io系列之字符流

    java中io流系统庞大,知识点众多,作为小白通过五天的视频书籍学习后,总结了io系列的随笔,以便将来复习查看. 本篇为此系列随笔的第一篇:io系列之字符流. IO流 :对数据的传输流向进行操作,ja ...

  6. C++读写TXT文件中的string或者int型数据以及string流的用法

    对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstre ...

  7. IO相关操作

    IO相关操作 对于IO操作而言,有四个基本的操作:open .read .write .close 我们来逐个解释.    在此之前我们先解释一下什么是文件描述符 文件描述符 操作系统通过一个整数开代 ...

  8. IO相关Demo

    这几天复习了IO相关知识 只为记录,好记性不如烂笔头 有误请指正 ありがとうございます. 我的公众号 作者:晨钟暮鼓c个人微信公众号:程序猿的月光宝盒 1.判断存在,存在改名,并延迟删除,不存在新建 ...

  9. 关于golang中IO相关的Buffer类浅析

    io重要的接口 在介绍buffer之前,先来认识两个重要的接口,如下边所示: type Reader interface { Read(p []byte) (n int, err error) } t ...

随机推荐

  1. 实验吧CTF题库-WEB题(部分)

    看起来有点难 提交admin http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&actio ...

  2. 利用 Flask+Redis 维护 IP 代理池

    代理池的维护 目前有很多网站提供免费代理,而且种类齐全,比如各个地区.各个匿名级别的都有,不过质量实在不敢恭维,毕竟都是免费公开的,可能一个代理无数个人在用也说不定.所以我们需要做的是大量抓取这些免费 ...

  3. 微信小程序wxss设置样式

    微信小程序wxss设置样式 对于以前搞客户端开发的来说,有着客户端的逻辑,就是不知道怎么设置样式,把对应的控件显示出来 一.wxml 界面结构wxmL比较容易理解,主要是由八大类基础组件构成: 一.视 ...

  4. Java微信公众平台开发(十)--微信自定义菜单的创建实现

    转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...

  5. Theos初步

    [Theos初步] 1.安装Theos.Theos需要在mac和ios上均安装,ios上安装的是Theos服务器,以使得mac的thoes可以直接安装app到ios设备上.如果不需要使用此功能,则仅安 ...

  6. 敏捷软件开发Note

    [敏捷原则] 1.我们最优先要做的是通过尽早的.持续的交付有价值的软件为使客户满意. 初期交付的系统中所包含的功能越少,最终交付的系统的质量就越高.交付的越频繁,最终的产品质量就越高.敏捷实践会说早地 ...

  7. 配置springboot在访问404时自定义返回结果以及统一异常处理

    在搭建项目框架的时候用的是springboot,想统一处理异常,但是发现404的错误总是捕捉不到,总是返回的是springBoot自带的错误结果信息. 如下是springBoot自带的错误结果信息: ...

  8. 基于jquery 的插件,让IE支持placeholder属性

    开发一个项目的时候为了美观和用户体验用到了input标签的placeholder属性,但是这个属性是html5中的,所以低版本的IE浏览器不支持.于是在百度找了一些解决方法,找了好几个都不是那么完美, ...

  9. Luogu 3237 [HNOI2014]米特运输

    BZOJ 3573 发现当一个点的权值确定了,整棵树的权值也会随之确定,这个确定关系表现在根结点的总权值上,如果一个点$x$的权值为$v$,那么一步步向上跳后,到根节点的权值就会变成$x*$每一个点的 ...

  10. poj 1988 Cube Stacking (并查集)

    题意:有N(N<=30,000)堆方块,开始每堆都是一个方块.方块编号1 – N. 有两种操作: M x y : 表示把方块x所在的堆,拿起来叠放到y所在的堆上. C x : 问方块x下面有多少 ...