在Linux C中,我们通常使用snprintf来格式化字符串输出,但是有一个问题,就是可能会频繁申请大的缓冲区,并且无法实现字符串的动态增加,比如你定义的字符缓存为100个字节,如果你格式化以后的内容超出了100个字节,那边后面的内容就无法看见. 所以一般来讲都为定义一个足够的字符缓冲,但这样的效率是很差的. 下面使用C++的ostringstream方式可以很轻松地搞定这些问题。
如果要重复使用一个ostringstream对象,并且需要在下次使用前清空缓冲区,则可以使用str()函数重设置缓冲区. 如:
ostringstream osSql;
//first time
osSql<<"SELECT COUNT(*) FROM t_XXXX";
...
clsConnection.Query( osSql );
....
//second time
osSql.str("");//重新使用一个空的缓冲区
osSql<<"INSERT INTO **********"<< strBigText ;
.......
1.在一个函数中重用ostringstream时,需要清空它,方法是ostr.str("")
2.获取格式化好的字符串, 通过ostringstream::str()函数就可以返回一个string对象, 调用string::c_str() 或string::data()函数就可以获得一个指向字符缓冲的char*变量.
下面给出一段示例代码
//g++ -g test_ostringstream.cpp -o test_ostringstream // #include <string> #include <sstream> #include <iostream> #include <unistd.h> using namespace std; int main(int argc, char* argv[]) { ostringstream os; for(int i=0; i<10000; i++) { os.str(""); string s = "a"; double d = i + 0.100; os << "The x is: "<< i << " " << s << " " << d; cout << os.str() << endl; if(i>0 && i%1000 == 0) usleep(10); } return 0; }运行截图如下:
参考文献
[1].C++ Primer第四版中文版 第258页
[2].http://zhilingluo.blog.hexun.com/12944836_d.html
[3].http://hi.baidu.com/gongziya/item/f395738a18dcbc53850fab03