0.stringstream所需头文件#include <sstream>
1.stringstream的<< >> 操作符可以直接操作字符串或数值
如:
#ifdef _UNICODE
typedef std::wstring tstring;
typedef std::wstringstream tstringstream;
#else
typedef std::string tstring;
typedef std::stringstream tstringstream;
#endif
int num = 2;
tstring strNum;
tstringstream stream;
stream << num;
stream >> strNum;
tstring strCHN = _T("汉字");
tstring strCHNN;
tstringstream strm;
strm << strCHN;
strm >> strCHNN;
2.>>操作符自动以空格作为截断,所以>>不适合用于输入一个带有空格的字符串,应该使用如下方法:
stringstream ss;
string strSql = ss.str();
或者使用getline函数
3.当多次使用同一个stringstream时,需要清空缓存
stringstream ss;
错误用法
ss.clear(); //实际上,它并不清空任何内容,它只是重置了流的状态标志而已!
正确用法
ss.str("");
补:而且需要重置游标
ss.seekg(0);
ss.seekp(0);
4.CString *pStr = new CString("aa");
正确的用法是:ss << LPCTSTR(*pStr);
错误的用法:ss << pStr; ss << *pStr。
5. ostream重载<< 64位无符号整数
std::ostream& operator << (std::ostream& strm, const unsigned __int64 value)
{
char buf[128] = {0};
_ui64toa(value, buf, 10);
strm << buf;
return strm;
}
6. 十六进制
unsigned int value = 47041;
stringstream sstream;
sstream << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << value ;
补:不能直接输出unsigned char,需要转换为整数:
unsigned char b =2;
sstream << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << (unsigned int)b;
7. string与double
(1)指定精度输出
double f = 3.14159;
std::cout << std::setprecision(5) << f;// 3.1416
(2)string转double
std::stod();// 该函数本身不会造成精度丢失
(3)double转string,保留精度(实际是指定一个较大的精度值)
stringstream strm;
string str;
double d = 314159.12612712;
strm.precision(12);// 指定12这个较大值
strm << d;
strm >> str;//输出314159.126127
8. 整型定宽及补齐
#include <iomanip>
int n = 2;
stringstream strm;
strm << std::right << std::setfill('0') << std::setw(4) << n; // 宽为4,左边补齐0,即输出0002
9.stringstream无法用转义字符
stringstream strm;
strm << '\t’ << '\r' << '\n';// 均不行,原因未知
9. 由于<<操作符自动以空格作为截断,所以用于条件运算时需要加括号
例如:
stringstream sstream;
bool b = true;
sstream << b ? "是” : “否";// 输出1而不是”是“
需要加括号用:
sstream << (b ? "是” : “否");