stringstream的用法c++11可以用吗,stringstream作用
[本文来自]http://www.builder.com.cn/2003/0304/83250.shtml
http://www.cppblog.com/alantop/archive/2007/07/10/27823.html
使用stringstream对象简化类型转换
C标准库中的Sstream提供了一些比ANSI C中的stdio.h更高级的功能,即简单性、类型安全和可扩展性。在本文中,我将展示如何使用这些库来实现安全和自动的类型转换。
你为什么想学
如果你习惯了stdio.h的风格转换,或许你首先会问:为什么要花额外的精力去学习基于sstream的类型转换?也许回顾下面这个简单的例子可以让你信服。假设您想使用sprintf()函数将一个变量从int类型转换为string类型。为了正确完成这项任务,您必须确保目标缓冲区有足够的空间来保存转换后的字符串。此外,您必须使用正确的格式化程序。如果使用了不正确的格式化程序,将会导致不可预知的后果。下面是一个例子:
int n=10000
chars[10];
sprintf(s," %d ",n);//s中的内容是“10000”
目前看来还不错。但是,对上述代码稍作修改就会使程序崩溃:
int n=10000
char s[10];
sprintf(s," %f ",n);//看!的格式化程序错误。
在这种情况下,程序员错误地使用了%f格式化程序,而不是% d。因此,在调用sprintf()后,s包含一个不确定的字符串。如果能自动推导出正确的类型不是更好吗?
输入字符串流
因为N和S的类型是在编译时确定的,所以编译器有足够的信息来确定需要哪些转换。sstream库中声明的标准类利用了这一点,并自动选择必要的转换。此外,转换结果保存在stringstream对象的内部缓冲区中。你不用担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。
你的编译器支持sstream吗?
Sstream库最近才被列入C标准。(不要把sstream和strstream混为一谈,strstream在标准发布前就被删除了。)因此,较老的编译器,如GCC2.95,不支持它。如果你正好在用这样的编译器,想用sstream,那就先升级一下。
Sstream库定义了三种类型:istringstream、ostringstream和stringstream,分别用于流的输入、输出和输入输出操作。此外,每个类都有相应的宽字符集版本。为简单起见,我主要关注stringstream,因为每个转换都涉及输入和输出操作。
请注意,sstream使用字符串对象,而不是字符数组。这可以避免缓冲区溢出的危险。此外,传入参数的类型和目标对象是自动派生的,即使使用了不正确的格式化程序,也不会有危险。
从字符串到整数的转换
string result=" 10000
int n=0;
流结果;
溪流n;//n等于10000
重用字符串流对象
如果打算在多次转换中使用同一个stringstream对象,记得在每次转换前使用clear()方法;
在多次转换中重用同一个stringstream对象(而不是每次都创建一个新对象)的最大优势在于效率。String对象的构造和析构通常会占用大量CPU时间。
在类型转换中使用模板
您可以轻松地定义一个函数模板,将任意类型转换为特定的目标类型。比如需要转换各种数值,比如int,long,double等。转换成字符串。您需要使用带有字符串类型和任意值t作为参数的to_string()函数。函数的作用是:将t转换成一个字符串,并写入结果。使用str()成员函数获取流的内部缓冲区的副本:
模板类T
void to_string(字符串结果,const T t)
{
ostringstream oss//创建一个流
OSS t;//将值作为流传递
result=OSS . str();//获取转换后的字符转折并写入结果
}
这样,您可以轻松地将各种数值转换成字符串:
to_string(s1,10.5);//双精度字符串
to_string(s2,123);//int到string
to_string(s3,true);//布尔值到字符串
您可以进一步定义一个通用转换模板,用于任意类型之间的转换。Template convert()包含两个模板参数out_type和in_value,其作用是将in_value转换为out_type:
模板类输出类型,类输入值
out_type convert(const in_value t)
{
stringstream流;
流t;//将值传递到流中
out_type结果;//转换结果存储在这里
流结果;//将值写入结果
返回结果;
}
像这样使用convert():
双d;
字符串工资;
string s=" 12.56
d=转换double //d等于12.56
薪金=转换字符串(9000.0);//工资等于“9000”
结论
在过去遗留下来的程序代码和纯C程序中,传统的stdio.h形式的改造已经伴随我们很久了。然而,正如本文所述,基于stringstream的转换具有类型安全和无溢出等显著特征,这让我们有足够的理由放弃stdio.h,转而使用sstream。Sstream库还提供了另一个特性——扩展性。您可以通过重载来支持自定义类型之间的转换。
一些例子:
Stringstream通常用于数据转换。
相比C库的转换,更安全,更自动化,更直接。
示例1:基本数据类型转换示例int到string
#包含字符串
#包含流
#包括iostream
intmain()
{
STD:string streamstream;
STD:string result;
inti=1000
流I;//将int输入流中
流结果;//从流中提取先前插入的int值
std:cout结果STD:endl;//打印字符串 1000
}
运行结果:
例2:除了基本类型的转换,还支持char *的转换。
#包含流
#包括iostream
intmain()
{
STD:string streamstream;
char result[8];
8888流;//将888插入流中
流结果;//将流中的值提取到结果中
std:cout结果STD:endl;//屏幕显示 8888
}
例3:执行多次转换时,必须调用stringstream的成员函数clear()。
#包含流
#包括iostream
intmain()
{
STD:string streamstream;
intfirst,second
流“456”;//插入字符串
先流;//转换为int
STD:cout first STD:endl;
stream . clear();//在多次转换之前必须清除流。
stream true//插入布尔值
流秒;//提取int
std:cout第二STD:endl;
}
运行clear的结果
没有跑清的结果。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。