C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。
(PS:自己解释的不知道准确不?)
str()成员函数的使用可以让stringstream对象返回一个string字符串。
c语言一般使用函数时候,最后,还有专门的代码去释放内存,c++一般就很少使用了,c++、 语言里面创建函数、变量之类的都是有生命周期的 ,用完了就自动释放内存,这个就是c++比c语言中优势之一。ss.str(string)里面含有参数,ss字符串流 然后str()指针指向String字符串,也就是说 输入流指向字符串的首地址,这样就可以一个一个指向string字符串中的所有元素 完成一个类似于遍历感觉的操作,这个函数就是一个指针而已,作用是指向一个地址,析构(就是清理)只能说是他的性质。(str()指针 指向字符串的首地址,字符串string生命周期结束后,指针被对象析构,如果 string对象调用结束后,指针还在,那么指针就会指向一个null的位置 代码出错)。
<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
----下面是在字符串流中,穿插使用模板函数(例如:在类型转换中使用模板)。
你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:
template<class T>
void to_string(string & result,const T& t)
{ostringstream oss;//创建一个流oss<<t;//把值传递如流中result=oss.str();//获取转换后的字符转并将其写入result
}
结果:
to_string(s1,10.5);//double到string
to_string(s2,123);//int到string
to_string(s3,true);//bool到string
可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_type和in_value,功能是将in_value值转换成out_type类型:
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;
}
结果:
这样使用convert():
double d;
string salary;
string s=”12.56”;
d=convert<double>(s);//d等于12.56
salary=convert<string>(9000.0);//salary等于”9000”
在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream>。<sstream>库还提供了另外一个特性—可扩展性。你可以通过重载来支持自定义类型间的转换。
//基本数据类型转换例子 int转string
#include <string>
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;std::string result;int i = 1000;stream << i; //将int输入流stream >> result; //从stream中抽取前面插入的int值std::cout << result << std::endl; // print the string "1000"
}
//char *的转换
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;char result[8] ;stream << 8888; //向stream中插入8888stream >> result; //抽取stream中的值到resultstd::cout << result << std::endl; // 屏幕显示 "8888"
}
//再进行多次转换的时候,必须调用stringstream的成员函数clear().
#include <sstream>
#include <iostream>
int main()
{std::stringstream stream;int first, second;stream<< "456"; //插入字符串stream >> first; //转换成intstd::cout << first << std::endl;stream.clear(); //在进行多次转换前,必须清除streamstream << true; //插入bool值stream >> second; //提取出intstd::cout << second << std::endl;
}
运行带clear()的结果,会输出456 1
运行不带clear的结果:第一个输出 456 第二个输出-564097321
-----istringstream
istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下:
istringstream::istringstream(string str);
#include <iostream>
#include <sstream>
using namespace std;
int main()
{istringstream istr;istr.str("1 56.7");//上述两个过程可以简单写成 istringstream istr("1 56.7");cout << istr.str() << endl;int a;float b;istr >> a;cout << a << endl;istr >> b;cout << b << endl;return 0;
}
运行结果: (PS:此处在istr>>a时,并未进行输入,为什么直接默认为1)
上例中,构造字符串流的时候,空格会成为字符串参数的内部分界, 例子中对a,b对象的输入"赋值"操作证明了这一点,字符串的空格成为了整型数据与浮点型数据的分解点,利用分界获取的方法我们事实上完成了字符串到整型对象与浮点型对象的拆分转换过程。
str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输出操作(cout<<istr.str();)。
参照博客:https://blog.csdn.net/liuweiyuxiang/article/details/89070296
https://blog.csdn.net/shs1992shs/article/details/83051298
http://c.biancheng.net/view/vip_3774.html