sting流:istringstream,ostringstream,stringstream。教会你str()和clear()的区别

<sstream> 主要用来进行数据类型转换,比如可以将一个int类型的对象存入流中,然后经过流赋值给一个string的对象中,从而实现了int到string的转变,由于 <sstream> 使用 string 对象来代替字符数组,就避免缓冲区溢出的危险;而且,因为传入参数和目标对象的类型会被自动推导出来,所以不存在错误的格式化符的问题。简单说,相比c库的数据类型转换而言,<sstream> 更加安全、自动和直接。

定义出三个流:

  • istringstream流的输入
  • ostringstream流的输出
  • stringstream流的输入输入

一,istringstream流的输入

保存一串字符串,并且能够分开识别里面的每个单词。

保存,赋值方法:

    istringstream stream(a);     //将字符串a保存到流中
    while (stream >> b){cout<<b<<endl;}     //将流中的单词一个一个赋值给b

重复利用的方法:因为每一此读取结束,都会到流的结尾,所以下次不能正常读取,此处需要用clear()清空,从而使得下一次读取还是从流的最初的地方开始

    stream.clear();    //将流的读取位置重新变为开头
    stream.str(a);      //重新给流赋值

#include<iostream>
#include<sstream>          //需要包含的头文件
using namespace std;

int main()
{
	string a, b;
	a = "asdas asdas asdfasd fdgbtrhh";    //字符串

	istringstream stream(a);       //保存一串字符,并且能够处理一串内的各个单词
	while (stream >> b)          //一个一个的读取流里面的单词
	{
		cout << b << endl;      
	}                   //当while循环结束,stream已经到达流的末尾

	stream.clear();    //如果想要再次使用stream,需要先清空
	//此处如果不清空,则还是流的末尾,在析取内容的时候,首先会判断流的状态,然后再决定是否读取
	stream.str(a);      //重新给流赋值


	system("pause");
	return 0;
}

二,ostringstream流的输出

将多个字符串保存到一起,然后一块输出

保存输出方法:

derr << a;       //将字符串a保存到流derr中
cout << derr.str();       //将流输出输出

#include<iostream>
#include<sstream>          //需要包含的头文件
#include<vector>
using namespace std;

int main()
{
	vector<string>a = { "asdas", "asdas", "asdfasd", "fdgbtrhh" };    //字符串

	ostringstream derr;      //定义流
	for (auto &b:a)   //用for读取容器中每一个字符串
	{
		derr << "  " << b;       //将每个字符串保存到derr中
	}
	cout << derr.str();          //将流输出

	system("pause");
	return 0;
}

三,stringstream流的输入输入

感觉相当于上面两种东西的整合,但是需要注意clear()和str(" ");的使用方法

  • clear()并非真正的清空,
  • x.str("")才是真正的清空流中的内容,类似于把一个空字符串赋给了x
#include<iostream>
#include<sstream>          //需要包含的头文件
#include<vector>
using namespace std;

int main()
{
	vector<string>a = { "asdas", "asdas", "asdfasd", "fdgbtrhh" };    //字符串

	stringstream mm;
	for (auto &b:a)
	{
		mm << "  " << b;       //将每个单词保存到derr中
	}
	cout << mm.str() << endl;          //将保存的单词全部输出

	string z = "sdafs adf we  awdqd ger rbber";
	mm.clear();           //clear并不会清空流中的内容,他只是把对最初最字符串转换类型等操作清除而已
	mm<<z;
	cout << mm.str() << endl;

	mm.str("");          //str("")才可以清空流中的内容
	mm << z;
	cout << mm.str();
	system("pause");
	return 0;
}

总结:这里主要谈一下,这里我对于clear(),以及str()使用场景的理解;

输入流:

首先:输入流的时侯,必须两个都要使用的,因为str()在这里就是一个赋值操作,将一个新的字符串赋给流,而此时如果不用clear(),则下一次流的读取位置仍然是结尾,尽管流的内容已经改变,但是下次不能读取。

输出流:

因为此时往流里面存入字符串用的是"<<"的方法,所以如果使用str(" ")不用清空的方法(换句话说是将“ ”一个空字符串来重新赋值)。那么再存入东西的时候,则会自动添加到之前流的后面;而此时clear()感觉用处不大,因为不论下一次读取位置在哪,都是会把整个流一块输出。

(如果这个地方我的理解错误,还希望大佬评论指正)

 

 

 

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大学生毕设

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值