目录
stringstream是字符串流。流和存储在内存中的字符串string对象是绑定的,可以在多种数据类型之间实现自动格式化;包含在头文件:
#include <sstream>
使用stringstream实现类型转换
int main()
{
//int 转string
int iValue = 512;
std::stringstream ss;
ss << iValue;
std::cout << "iValue: " << ss.str() << std::endl;
//string 转 int
int iConvertValue;
ss >> iConvertValue;
std::cout << "iConvertValue: " << iConvertValue << std::endl;
return 0;
}
ss.str(): 把流的内容转换成字符串形式;
ss >> iConvertValue; 把流的内容以iConvertValue的类型输出给iConvertValue;
iValue: 512
iConvertValue: 512
stringstream清空流内的内容
int main()
{
std::string szValue1 = "111", szValue2 = "222";
std::stringstream ss;
ss << "["<<szValue1<<"]["<< szValue2<<"]";
std::cout << "iValue: " << ss.str() << std::endl;
ss.clear();
std::cout << "iValue: " << ss.str() << std::endl;
ss.str("");
std::cout << "iValue: " << ss.str() << std::endl;
return 0;
}
结果:
iValue: [111][222]
iValue: [111][222]
iValue:
- 输出流内的内容,为[111][222];
- 调用clear(),输出内容为[111][222],是因为这里clear()的作用重置流的标志状态;
- 调用str(“”), 输出内容为空,str(“”) 清空流的内存缓冲;
注意:streamstring在调用str()时,会返回临时的string对象。而因为是临时的对象,所以它在整个表达式结束后将会被析构。
stringstream在进行不同类型转换时,需要调用clear()
int main()
{
int iValue1, iValue2;
std::stringstream ss;
ss << "456";
ss >> iValue1; // 转换为int类型
std::cout << "iValue1: "<< iValue1 << std::endl;
// ss.clear(); // 在进行多次类型转换前,必须先运行clear()
ss << true; // 插入bool值
ss >> iValue2; // 转换为int类型
std::cout << "iValue2: " << iValue2 << std::endl;
}
不调用clear()结果,iValue2输出错误:
iValue1: 456
iValue2: 545
调用clear()结果,iValue2输出正确:
iValue1: 456
iValue2: 1
stringstream添加格式控制
int main()
{
unsigned long long ull1 = 0x2022222222;
std::stringstream buffer;
buffer <<"["<< ull1 << "]";
std::cout << "输出: " << buffer.str() << std::endl;
buffer.clear();
buffer.str("");
//十六进制,不显示前缀:
buffer << "[" << std::hex << ull1 << "]"; //十六进制输出
std::cout << "十六进制输出: " << buffer.str() << std::endl;
buffer.clear();
buffer.str("");
//十六进制,显示前缀:
buffer.setf(std::ios::showbase); //显示前缀
buffer << "[" << std::hex << ull1 << "]";
std::cout << "十六进制输出,显示前缀: " << buffer.str() << std::endl;
return 0;
}
结果:
输出: [138011615778]
十六进制输出: [2022222222]
十六进制输出,显示前缀: [0x2022222222]
stringstream去掉格式控制(标志位)
int main()
{
unsigned long long ull = 0x2022222222;
std::stringstream buffer;
//原数据显示
buffer << "[" << ull << "]";
std::cout << "原数据显示: " << buffer.str() << std::endl;
buffer.clear();
buffer.str("");
//十六进制显示
buffer.setf(std::ios::showbase); //显示前缀
buffer << "[" << std::hex << ull << "]"; //十六进制显示
buffer << "[" << ull << "]";
std::cout << "十六进制显示: " << buffer.str() << std::endl;
buffer.clear();
buffer.str("");
//去掉前缀显示标志位显示
buffer.unsetf(std::ios::showbase); //去掉前缀显示标志位
buffer << "[" << ull << "]";
std::cout << "去掉前缀显示标志位显示: " << buffer.str() << std::endl;
buffer.clear();
buffer.str("");
//取消十六进制显示
buffer.unsetf(std::ios::hex); //取消十六进制显示
buffer << "[" << ull << "]";
std::cout << "取消十六进制显示: " << buffer.str() << std::endl;
return 0;
}
结果:
原数据显示: [138011615778]
十六进制显示: [0x2022222222][0x2022222222]
去掉前缀显示标志位显示: [2022222222]
取消十六进制显示: [138011615778]