c++字符串操作之std::ostringstream踩坑日记
在开发过程中经常会遇到字符串操作,而std::string又没有format操作,这就很难受了。
于是我找到了std::ostringstream类;ostringstream类的用法也很简单,就是流操作。
头文件:include <sstream>
如:
int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr << "整形数据为:" << number << std::endl;
ostr << "浮点数为:" << ddata << std::endl;
ostr << "字符串为:" << pstr << std::endl;
std::cout << ostr.str();//str()是以std::string的形式返回
输出结果是这样的
开始测试:
整形数据为:14
浮点数为:21.7
字符串为:test
但是问题来了,通常一个变量或对象需要重复使用。那我要如何清除流中的数据呢?
一般的思路都是clear()。因为在STL容器里习惯都是clear()方法清空容器。所以第一反应都是用clear()方法来清除流中的数据。
试调用,ostr.clear();编译不报错(说明有这个方法存在,心想那就没错了,聪明的我一猜就对)。
int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr.clear();
ostr << "整形数据为:" << number << std::endl;
ostr.clear();
ostr << "浮点数为:" << ddata << std::endl;
ostr.clear();
ostr << "字符串为:" << pstr << std::endl;
ostr.clear();
std::cout << ostr.str();//str()是以std::string的形式返回
理论上说输出应该是这样的
字符串为:test
结果很打脸,无论我怎么调用clear()都无法清除ostr缓存中的数据。输出结果都是这样的:
开始测试:
整形数据为:14
浮点数为:21.7
字符串为:test
经过一番查找资料发现,原来在STL的所有流中clear的含义均为清空错误标记!并非是清空容器。。。
巨坑,习惯性的认为clear()方法就是清空内容,但实际上他是清除错误标记。
那我需要清空内容该如何呢?
需要用void str ( const string & s )方法,该方法是重新给ostringstream灌新值的意思。
如:
int number = 14;
double ddata = 21.7;
char* pstr = "test";
std::ostringstream ostr;
ostr << "开始测试:" << std::endl;
ostr.str("");
ostr << "整形数据为:" << number << std::endl;
ostr.str("");
ostr << "浮点数为:" << ddata << std::endl;
ostr.str("");
ostr << "字符串为:" << pstr << std::endl;
ostr.str("");
std::cout << ostr.str();//str()是以std::string的形式返回
输出结果为:
字符串为:test
神奇吧。。。
同理 ostr.str(“Hello”)将会使ostr中的内容为"Hello"。但注意:ostr.str(“Hello”); ostr << “World”;的执行结果将会变成"World"而不是"HelloWorld"。
相信不少程序猿都踩过这个坑吧!