17 C++的字符串流(sstream)

17 C++的字符串流(sstream)


1. 基本概念

用内存中的string类型变量作为输入和输出的对象.
特点:

  1. 与标准输入输出流相同,能够进行文本与二进制之间的相互转换
    向string存数据 ⇔ \Leftrightarrow cout 二进制转为ASCII
    从string取数据 ⇔ \Leftrightarrow cin ASCII转为二进制
  2. 无需打开关闭
  3. 能够存放各种类型数据

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类似.接下来给出一个类型转换技巧:

  1. 特定类型的转换
    利用>>将ascii艹为二进制:
    在这里插入图片描述
    利用<<将二进制艹为ascii:
    在这里插入图片描述
  2. 可以通过重载方式/类模板方式写一个万能转换:
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');
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值