stringstream的用法
C++标准库中的
为什么要学习
如果你已习惯了
int n=10000;
char s[10];
sprintf(s,”%d”,n);// s中的内容为“10000”
到目前为止看起来还不错。但是,对上面代码的一个微小的改变就会使程序崩溃:
int n=10000;
char s[10];
sprintf(s,”%f”,n);// 看!错误的格式化符
在这种情况下,程序员错误地使用了%f格式化符来替代了%d。因此,s在调用完sprintf()后包含了一个不确定的字符串。要是能自动推导出正确的类型,那不是更好吗?
由于n和s的类型在编译期就确定了,所以编译器拥有足够的信息来判断需要哪些转换。
1. istringstream是由一个string对象构造而来,istringstream类从一个string对象读取字符。
istringstream的构造函数原形如下:
istringstream::istringstream(string str);
istringstream istr;
istr.str("1 56.7",); //上述两个过程可以简单写成 istringstream istr("1 56.7");
str()成员函数的使用可以让istringstream对象返回一个string字符串(例如本例中的输
出操作(cout<
2. ostringstream同样是由一个string对象构造而来,ostringstream类向一个string插入字符。
ostringstream的构造函数原形如下:
ostringstream::ostringstream(string str);
3. 对于stringstream了来说,不用我多说,大家也已经知道它是用于C++风格的字符串的
输入输出的。
stringstream的构造函数原形如下:
stringstream::stringstream(string str);
注意,
string到int的转换
string result=”10000”;
int n=0;
stream<
stream>>n; //n等于10000
重复利用stringstream对象
如果你打算在多次转换中使用同一个stringstream对象,记住每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
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;
在类型转换中使用模板
你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:
template
void to_string(string & result,const T& t){
ostringstream oss;//创建一个流
oss<
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
out_type convert(const in_value & t){
stringstream stream;//能>>也能<<
stream<
out_type result;//这里存储转换结果
stream>>result;//向result中写入值
return result;
}
这样使用convert():
double d;
string salary;
string s=”12.56”;
d=convert
salary=convert
例子:
int main()
{
istringstream istr;
istr.str("1 56.7",); //上述两个过程可以简单写成 istringstream istr("1 56.7");
cout << istr.str()<
float b;
istr>>a;
cout< istr>>b;
cout< system("pause");
}//
int main()
{
ostringstream ostr; //ostr.str("abc");//如果构造的时候设置了字符串参数,那么增长操作的时
//候不会从结尾开始增加,而是修改原有数据,超出的部分增长
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<
}//
int main()
{
stringstream ostr("ccc");
ostr.put('d');
ostr.put('e');
ostr<<"fg";
string gstr = ostr.str();
cout<
ostr>>a;
cout< system("pause");
}
int main()
{
stringstream sstr;
//--------int转string-----------
int a=100;
string str;
sstr< sstr>>str;
cout<
sstr.clear();
string name = "colinguan";
char cname[200];
sstr<
cout<
}