You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何stringstream在十六进制格式化读取后未消耗输出内容?

stringstream重复读取同一值的原因及解决方法

先看你提供的代码:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;
    unsigned int output;
    
    ss << "0xBB";
    ss >> std::hex >> output;
    std::cout << output << std::endl;
    
    ss << "0xAA";
    ss >> std::hex >> output;
    std::cout << output;
}

问题根源

第一次读取0xBB时,读取指针走到了流的末尾,此时stringstream会被设置eofbit(到达流尾)标志,进入错误状态。后续即使你向流中追加写入0xAA,错误状态不会自动清除,第二次的>>读取操作会直接跳过,不会更新output的值,所以它始终保留第一次的结果187。

注意:stringstream的读取指针确实会在读取时移动,但一旦触发eofbit,流就会拒绝执行后续输入操作,直到错误状态被清除。

解决方法

方法一:清空流内容(适合不需要保留之前数据的场景)

直接清空流的存储内容并清除错误状态,之后重新写入新数据:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;
    unsigned int output;
    
    ss << "0xBB";
    ss >> std::hex >> output;
    std::cout << output << std::endl;
    
    // 清空流内容 + 清除错误状态
    ss.str("");
    ss.clear();
    
    ss << "0xAA";
    ss >> std::hex >> output;
    std::cout << output;
}

方法二:保留流内容,调整状态与指针(适合需要追加数据的场景)

如果需要保留流中已有的数据,只需清除错误状态,并确保读取指针处于新写入数据的起始位置:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;
    unsigned int output;
    
    ss << "0xBB";
    ss >> std::hex >> output;
    std::cout << output << std::endl;
    
    // 清除eof等错误状态
    ss.clear();
    // 将读取指针移到流末尾,确保后续写入的新数据能被读取到
    ss.seekg(0, std::ios::end);
    
    ss << "0xAA";
    ss >> std::hex >> output;
    std::cout << output;
}

两种方法运行后都会输出预期的:

187
170

内容的提问来源于stack exchange,提问作者toxic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 03:20:20