【Q&A】istringstream 重新设定输入字符串问题

需求是这样的:很多时候,我们会从文本文件中读取一行内容,并用流的方式对这行内容进行解析。

从文本中读取某一行,用getline就很好完成,然后将这一行内容的string作为初始化参数,初始化istringstream对象,对istringstream对象用流的方式进行解析。典型的代码是这样的:

string sLine;
while (getline (in, sLine)) // in 是 ifstream对象
{
istringstream isLine (sLine);
isLine >> ......// 用流的方式对字符串sLine的内容进行解析
}
当解析完isLine中的字符串内容之后,如果还有其他的字符串,如:另一个字符串sLine2中的内容需要解析,那么希望重新设定isLine中字符串的内容,并继续用流的方式解析。当然,如果另外再声明一个istringstream变量,如:isLine2,然后用sLine2的内容构造它,也没有问题。不过过多的istringstream实例,使代码看起来不是很干净。查msdn,istringstream重新设定字符串内容的函数是str(),将代码改动如下:
string sLine;
while (getline (in, sLine)) // in 是 ifstream对象
{
istringstream isLine (sLine);
isLine >> ......// 用流的方式对字符串sLine的内容进行解析

string sLine2("xxxx");
isLine->rdbuf()->str(sLine2);
isLine >> ...... // 此处失败
}
不过上面代码在运行的时候失败。查msdn看不出所以然,后来发现,当析取出isLine中的内容之后,流的状态被改变了,变成了“已经到达流的末尾”。str()函数虽然重新设定了流的内容,不过没有更改过来状态,在析取内容的时候,首先会判断流的状态,然后再决定是否读取。这样就悲剧了。想要重新读取流的内容,在str()之前还要将状态更改回来,用clear()函数;而且,要重新设定读取位置为流的开始位置,用seekg()函数。代码如下:

string sLine;
while (getline (in, sLine)) // in 是 ifstream对象
{
istringstream isLine (sLine);
isLine >> ......// 用流的方式对字符串sLine的内容进行解析

string sLine2("xxxx");
isLine->clear(); // 重设状态
isLine->rdbuf()->str(sLine2);
isLine->seekg(0, ios::beg); // 重设读取位置
isLine >> ...... // 这次OK了
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值