17 C++的字符串流(sstream)
文章目录
1. 基本概念
用内存中的string类型变量作为输入和输出的对象.
特点:
- 与标准输入输出流相同,能够进行文本与二进制之间的相互转换
向string存数据 ⇔ \Leftrightarrow ⇔cout 二进制转为ASCII
从string取数据 ⇔ \Leftrightarrow ⇔cin ASCII转为二进制 - 无需打开关闭
- 能够存放各种类型数据
2. 使用
#include <sstream>
ostringstream ostr;//输出流
istringstream istr;//输入流
stringstream str;//输入/输出流
成员函数:str()可以将ostringstream的内容转换为string格式.
1. 使用的基本例子:
istringstream sin("Hello 10 12.3");
cout << sin.str() << endl;
char s[10];
int i;
double d;
sin >> s >> i >> d;
cout << "s:" << s << endl;
cout << "i:" << i << endl;
cout << "d:" << d << endl;
cout << "in.good()" << sin.good() << endl;
cout << "in.str()" << sin.str() << endl;
运行结果:
读取结束之后内容仍在,若现有内容读取完毕good()置为0,假如需要重复读取则需:
sin.clear();
sin.seekg(0,ios::beg);
2. 错误情况下的例子,如short超范围,处理类似于cin
可见出错会导致后续读入不可信,如果在sh读入后进行sin.clear(),d仍然可以读到12.3.
3. 中途使用一参str()改变内容
但是在sin中多加一个数据后…
是不是粗略get到了good()的意义?
4. stringstream可读可写
故技重施,想办法吧good()弄成1:
加了一行clear(),还是不够,显然是因为指针并没有复位:
万事大吉,自行揣摩,显然当good()为0时,seekg并没有随新内容输入而变化.
总结一下,当good()置0时,seekg跟着置为-1,此时改变stringstream值是无效的,进行clear()操作后,tellg会处于"Hello 10 12.3"的3([12])的后一个位置.此时移动指针可以继续输出新内容.
3. 实现类型转换
上述粗略介绍了一点应用和good(),clear()的重要性,存储的形式为string不需要考虑空间,且很多方式特别是错误处理都和iostream类似.接下来给出一个类型转换技巧:
- 特定类型的转换
利用>>将ascii艹为二进制:
利用<<将二进制艹为ascii:
- 可以通过重载方式/类模板方式写一个万能转换:
template <class out_type ,class in_type>
out_type my_convert(const in_type &input){
string ss;
ss<<input;//二进制转ascii
out_type res;
ss>>res;//ascii转二进制
return res;
}
4. 逐行读取函数
static void get_info_to_string(fstream& fp, stringstream& ss)
{
char ch;
if (!fp.good())
fp.clear();
fp.seekg(0, ios::beg);
while ((ch = fp.get()) != EOF)
ss << ch;
}
然后再从内存中循环读取:
while (1) {
if (!ss.good()) {
ss.clear();
break;
}
char buf[1000] = { 0 };
ss.getline(buf, 1000, '\n');
}