为何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
相关产品推荐
相关产品推荐

