<sstream>
库定义了三种类:istringstream、ostringstream和stringstream
,分别用来进行string
流的输入、输出和输入输出操作。
另外,每个类都有一个对应的宽字符集版本。
简单起见,主要以stringstream
为中心,因为每个转换都要涉及到输入和输出操作。
注意,<sstream>
使用string
对象来代替字符数组。
这样可以避免缓冲区溢出的危险。
而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
string result=”10000”; int n=0; stream<<result; stream>>n;//n等于10000
重复利用stringstream
对象
如果你打算在多次转换中使用同一个stringstream
对象,记住再每次转换前要使用clear()
方法;
在多次转换中重复使用同一个stringstream
(而不是每次都创建一个新的对象)对象最大的好处在于效率。 stringstream
对象的构造和析构函数
通常是非常耗费CPU时间的。
在类型转换中使用模板
你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如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”
结论
例子一:基本数据类型转换例子 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中插入8888 stream >> result; //抽取stream中的值到result std::cout << result << std::endl; // 屏幕显示 "8888" }
例子三:再进行多次转换的时候,必须调用stringstream
的成员函数clear()
.
#include <sstream> #include <iostream> int main() { std::stringstream stream; int first, second; stream<< "456"; //插入字符串 stream >> first; //转换成int std::cout << first << std::endl; stream.clear(); //在进行多次转换前,必须清除stream stream << true; //插入bool值 stream >> second; //提取出int std::cout << second << std::endl; }
运行clear的结果
003
没有运行clear的结果
004
注:关于stream.clear()
和stream.str("")
,作用还不太清楚。又说clear
是清除标志位,str("")
是清楚stream内容的。但在多次转换过程是,的确是使用clear
才准确,这是验证过的。