浅谈stringstream的用法


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:
  1. 输出流内的内容,为[111][222];
  2. 调用clear(),输出内容为[111][222],是因为这里clear()的作用重置流的标志状态;
  3. 调用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]

参考文献:
C++ 中的 cout.setf() 函数
stringstream用法

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzy0621

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值