关于stringstream的用法总结

将整形转化成字符串

#include <iostream>
#include <sstream>using namespace std;
string i2s(int i, int len = 0)
{stringstream ss;ss.width(len); //设置宽度ss.fill('0'); //填充'0'ss << i;return ss.str();
}
int main()
{int a = 7, b = 3;string str = i2s(a, b);cout << str << endl;return 0;
}

输出结果如下:

关于stringstream使用的一个例子

题目:输入的第一行有一个数字N代表接下来有N行资料,每一行资料有不固定个数的整数(最多20个,每行最大200个字元),请你写一个程序将每行的总和打印出来。

#include <iostream>
#include <sstream>
using namespace std;
int main()
{string s;stringstream ss;int n, i, sum, a;cin >> n;getline(cin, s);//读取换行,用cin.get()也可以for (i = 0; i < n; ++i){getline(cin, s);ss.clear();ss.str(s);sum = 0;while (1){ss >> a;if (ss.fail())//如果badfail或failbit被设置,条件才成立(在这里是想要将下一个//字符转换成整数,没有成功,所以导致failbit置为1,//而eof()表示是到文件尾,若使用的话,用法如下:)break;sum += a;}/*while (!ss.eof())//eof()的用法{ss >> a;sum += a;}*/cout << sum << endl;}return 0;
}

输出结果如下:

字符串转换成整形

#include <iostream>
#include <sstream>
using namespace std;
int main()
{string result = "10000";stringstream stream;int n = 0;stream << result;stream >> n;cout << n << endl;return 0;
}

重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

在类型转换中使用模板

你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:

#include <iostream>
#include <sstream>
using namespace std;
template<class T>
void to_string(string& result, const T& t)
{ostringstream oss;//创建一个流oss << t; //把值传递入流中result = oss.str(); //获取转换后的字符串并将其写入result
}
int main()
{string s1, s2, s3;to_string(s1, 10.5); //double转换成stringto_string(s2, 123); //int转换成stringto_string(s3, true); //bool转换成stringcout << s1 << endl;cout << s2 << endl;cout << s3 << endl;return 0;
}

结果如下:

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:

#include <iostream>
#include <sstream>
using namespace std;
template<class out_type, class in_value>
out_type convert(const in_value& t)
{stringstream stream;stream << t;//向流中传值out_type result;//这里存储转换结果stream >> result;//向result中写入值return result;
}
int main()
{string salary;double d;string s = "12.56";d = convert<double>(s);//d等于12.56salary = convert<string>(9000.0);//salary为"9000"cout << d << endl;cout << salary << endl;return 0;
}

结论

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用。库还提供了另外一个特性—可扩展性。你可以通过重载来支持自定义类型间的转换
stringstream通常是用来做数据转换的。
相比c库的转换,它更加安全,自动和直接。

除了基本类型的转换,也支持char *的转换
#include <iostream>
#include <sstream>
using namespace std;
int main()
{stringstream stream;char result[8];stream << 8888;//向stream中插入8888stream >> result;//抽取stream中的值到resultcout << result << endl;return 0;
}


< sstream > 库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。一般情况下使用stringstream就足够,因为字符串要频繁的涉及到输入输出。
< sstream > 使用string对象来代替字符数组,这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即便使用了不正确的格式化符也没有危险。
与文件流fstream类似,通过插入器(<<)和析取器(>>)这两个运算符可以直接对stringstream上的数据输入输出,而将stringstream中的全部数据输出则是使用成员函数str(),其有两种形式:
1、void str() //无参形式,用于将stringstream流中的数据以string字符串的形式输出
2、void str (const string& s)//以字符串为参数,用以覆盖stringstream流中的数据
在对同一个stringstream对象重复赋值,就需要先对流使用clear()函数清空流的状态,此时流占用的内存没有改变,会一直增加(stringstream不主动释放内存),若想改变内存(一般是清除内存,减少内存消耗),需要再配合使用str("")清空stringstream的缓存。

关于stringstream中clear()用法的进一步总结

#include <iostream>
#include <sstream>
using namespace std;
int main()
{stringstream stream;int first, second;stream << "456";//插入字符串stream >> first;//转换成intcout << first << endl;stream.clear();//清除流stream.str("");//清空流缓存stream << true;//插入bool值stream >> second;//提取出intcout << second << endl;return 0;
}

stringstream与fstream

通过重载的<<和>>运算符可以将文件流中的数据输出到C++字符串中,它们之间的媒介是缓冲区streambuf,可由流的成员函数rdbuf()读取。

 string str;ifstream in;in.open("D:\\C++\\hello.txt");//读取文件的缓冲内容到数据流中stringstream ss;ss << in.rdbuf();in.close();//关闭文件str = ss.str();//将stringstream流中的数据赋值给string类型字符串//const char* p = str.c_str();//将字符串内容转化为C_string类型cout << str << endl;return 0;

参考博文
string和stringstream用法详解
下面一篇也写的比较好。待有时间进一步总结
C++字符串流stringstream与string知识介绍与用法小结

关于stringstream的用法总结相关推荐

  1. C++ stringstream的用法

    Created at    stringstream的用法 使用stringstream对象简化类型转换 C++标准库中的<sstream>提供了比ANSI C的<stdio.h&g ...

  2. c++中stringstream常见用法

    c++中stringstream常见用法 stringstream使用时,要包含头文件#include<sstream>,sstream这个库的又是在于存入类型的数据可以直接进行转换,不用 ...

  3. stringstream常见用法介绍

    本文主要介绍 C++ 中 stringstream 类的常见用法. 1 概述 <sstream> 定义了三个类:istringstream.ostringstream 和 stringst ...

  4. C++istringstream, ostringstream, stringstream的用法

    1.ostringstream:ostringstream 对象用来进行格式化的输出,可以方便的将各种类型转换为string类型.ostringstream 只支持 << 操作符. 2.i ...

  5. stringstream的用法

    C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性. <sstream>库定义了三种类:ist ...

  6. C++ istringstream、ostringstream、stringstream类用法详解

    文章目录 0 概述 1 istringstream 2 ostringstream 3 stringstream 4 类型转换 5 reference 0 概述 C++引入了ostringstream ...

  7. stringstream用法

    分为istream和ostringstream. 1 std::string name("zeta");2 int age = 27;3 4 ostringstream os;5 ...

  8. 2013蓝桥杯C++A:颠倒的价牌(stringstream用法)

    四.题目:颠倒的价牌 Description 小李的店里专卖其它店中下架的样品电视机,可称为:样品电视专卖店. 其标价都是4位数字(即千元不等). 小李为了标价清晰.方便,使用了预制的类似数码管的标价 ...

  9. C++ string与vectorfloat类型相互转换之stringstream

    1.stringstream类型转换用法 streamstring在调用str()时,会返回临时的string对象.而因为是临时的对象,所以它在整个表达式结束后将会被析构. 如果需要进一步操作stri ...

最新文章

  1. mysql 错误1136_mysql,_MySQL错误:Error Code: 1136,mysql - phpStudy
  2. 滚动到底部或顶部响应的ScrollView使用
  3. css 设置背景图一半_CSS背景图设置
  4. 转---SQL与EXCEL交互(导出/导入)
  5. locate 和 find
  6. P4449-于神之怒加强版【莫比乌斯反演】
  7. Python--进程、线程、协程对比
  8. php 位运算与权限,PHP中的二进制位运算和权限存储
  9. 什么都懂, 为什么没有业绩?
  10. switch case 解决字符串选择的问题
  11. 北师范《计算机导论》在线作业,福建师范大学17年8月《计算机导论》作业考核试题答案材料...
  12. 计算机系统中字word的描述性定义是,计算机基础练习题1
  13. putty远程连接以及密钥
  14. java.lang.OutOfMemoryError: PermGen space tomcat启动项目出错
  15. 单片机c语言轻松入门 pdf,单片机C语言轻松入门(第2版)
  16. 简易网站流量统计工具
  17. 倍福电子凸轮实现案例展示
  18. 微信小程序用canvas画图并分享
  19. 图数据库neo4j的编程语句(详解)
  20. DigiCert和GlobalSign单域名OV SSL证书对比评测

热门文章

  1. eclipse下载太慢怎么办
  2. 几个可以免费下载知网文档,和查重的网站
  3. 【超好懂的比赛题解】HNCPC Multi-university Training Round3 比赛题解
  4. 暴走漫画 Rage Comic
  5. 计算机系统的基本理论
  6. 朋友高考没考好怎么安慰的话
  7. 如何开启Excel按拼音排序功能
  8. 使用Doxygen生成中文文档
  9. pycharm英文版转换为中文版教程
  10. ubuntu 下使用ie浏览器