c++IO库之string流超详细整理,建议赶紧收藏! ! !

Posted 大忽悠爱忽悠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++IO库之string流超详细整理,建议赶紧收藏! ! !相关的知识,希望对你有一定的参考价值。

初识IO库string流

  • sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样。
  • istringstream从string读取数据,ostringstream向string写入数据,而头文件stringstream既可以从string读数据也可以像string写数据。与fstream类型类似,头文件sstream中定义的类型都继承自我们已经使用过的iostream头文件中定义的类型。除了继承得来的操作,sstream中定义的类型还增加了一些成员来管理与流相关的string。
  • 下表列出了这些操作,可以对stringstream对象调用这些操作,但不能对其他IO类型调用这些操作.
sstream strm;strm是一个未绑定的stringstream对象.sstream是头文件sstream中定义的一个类型.
sstream strm(s);strm是一个sstream对象,保存string s的一个拷贝。此构造函数是explicit的.
strm.str()返回str所保存的string的拷贝
strm.str(s)将string s拷贝到strm中,返回void

istringstream的使用方法

  • 当我们的某些工作是对整行文本进行处理时,而其他工作是处理行内的单个单词时,通常用istringstream。
  • 考虑这样一个例子,假定有一个文件,列出了一些人和他们的电话号码。某些人只有一个号码,而另一些人则有多个----家庭电话,工作电话,移动电话等。我们输入文件看起来可能是这样的:
 morgan  201552368  862550123
 drew    9735550130
 lee     6095550132   2015550175  8005550000
  • 文件中每条记录都以一个人名开始,后面跟随一个或多个电话号码。
  • 我们首先定义一个简单化的类来描述输入数据:
struct PersonInfo
{
string name;
vector<string> phones;
}
  • 类型PersonInfo的对象会有一个成员表示人名,还有一个vector来保存此人的所有电话号码。
  • 我们的程序会读取数据文件,并创建一个PersonInof的vector。vector中每个元素对应文件中的一条记录。我们在一个循环中处理输入的数据,每个循环步读取一条记录,提取出一个人名和若干电话号码:
	string line, word; //分别保存来自输入的一行和单词
	vector<PersonInfo> people;//保存来自输入的所有记录
	//逐行从输入读取数据,直至cin遇到文件尾(或其他错误)
	while (getline(cin, line)&&line!="over")
	{
		PersonInfo info;//创建一个保存此记录数据的对象
		istringstream record(line);// 将记录绑定到刚读入的行
		record >> info.name;//读取名字---遇到空格结束输入
		while (record >> word)//读取电话号码
		{
			info.phones.push_back(word);
		}
		people.push_back(info); //将此记录追加到people末尾
	}
	for (int i = 0; i < people.size(); i++)
		for(int j=0;j<people[i].phones.size();++j)
		cout << people[i].name << "  " << people[i].phones[j] << endl;

在这里插入图片描述

  • record>>info.name是从一个string而不是标准输入读取数据。当string中的数据全部读出后while (record >> word),同样会触发"文件结束"信号,在record上的下一个输入操作会失败
  • 注意使用istringstream定义的对象绑定一个string字符串后,向一个string对象输入时,遇到空格会结束当前部分的输入

ostringstream的使用方法

  • 当我们逐步构造输出,希望最后一起打印时,ostringstream是很有用的.
  • 例如:当我们想逐个验证电话号码并改变其格式.如果所有号码都是有效的,我们希望输出一个新的文件,包含改变格式后的号码。
  • 对于那些无效号码,我们将不会将他们输出到新文件中,而是打印一条包含人名和无效号码的错误信息。
  • 由于我们不希望输出无效电话号码的人,因此对每个人,直到验证完所有电话号码后才能进行输出操作。
  • 但是,我们可以先将输出内容"写入"到一个内存ostringstream中。
	string line, word; //分别保存来自输入的一行和单词
	vector<PersonInfo> people;//保存来自输入的所有记录
	//逐行从输入读取数据,直至cin遇到文件尾(或其他错误)
	while (getline(cin, line)&&line!="over")
	{
		PersonInfo info;//创建一个保存此记录数据的对象
		istringstream record(line);// 将记录绑定到刚读入的行
		record >> info.name;//读取名字---遇到空格结束输入
		while (record >> word)//读取电话号码
		{
			info.phones.push_back(word);
		}
		people.push_back(info); //将此记录追加到people末尾
	}
	for (const auto& entry : people)
	{
		ostringstream formatted, badnums;
		for (const auto& nums : entry.phones)
		{
			if (!vaild(nums))
			{
				badnums << "  " << nums;
			}
			else
			{
				formatted << "  " << nums;
			}
			if (badnums.str().empty())
				cout << entry.name << formatted.str() << endl;
			else
				cout <<"错误信息:  "<< entry.name << badnums.str() << endl;
		}
	}

在这里插入图片描述

  • 我们使用标准的输出运算符(<<)向这些对象写入数据,但这些“写入”操作实际上转换为string操作,分别向formatted和badnums中的string对象添加字符。

总结

  1. istringstream常用来与一个string对象绑定,然后将绑定的string字符串按空格分隔写入其他字符串中.
  2. ostringstream可以保存当前某个字符串,等到合适的时候打印输出

以上是关于c++IO库之string流超详细整理,建议赶紧收藏! ! !的主要内容,如果未能解决你的问题,请参考以下文章

Hive从入门到精通,HQL硬核整理四万字,全面总结,附详细解析,赶紧收藏吧!!

全网最详细的Python入门基础教程(非常详细,赶紧收藏)

Redis从青铜到王者,从环境搭建到熟练使用,看这一篇就够了,超全整理详细解析,赶紧收藏吧!!!

云原生消息事件流超融合平台——RocketMQ 5.0 初探

云原生消息事件流超融合平台——RocketMQ 5.0 初探

C++-string常用函数整理(建议收藏)