c++IO库之string流超详细整理,建议赶紧收藏! ! !
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++IO库之string流超详细整理,建议赶紧收藏! ! !相关的知识,希望对你有一定的参考价值。
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对象添加字符。
总结
- istringstream常用来与一个string对象绑定,然后将绑定的string字符串按空格分隔写入其他字符串中.
- ostringstream可以保存当前某个字符串,等到合适的时候打印输出
以上是关于c++IO库之string流超详细整理,建议赶紧收藏! ! !的主要内容,如果未能解决你的问题,请参考以下文章
Hive从入门到精通,HQL硬核整理四万字,全面总结,附详细解析,赶紧收藏吧!!
Redis从青铜到王者,从环境搭建到熟练使用,看这一篇就够了,超全整理详细解析,赶紧收藏吧!!!
云原生消息事件流超融合平台——RocketMQ 5.0 初探