【发布时间】:2014-11-29 15:26:01
【问题描述】:
我需要一个自定义的提取器(运算符>>)来读取特定的字符串 变成我自己的数据类型。
问题是对字符串的要求很大。
因此最简单的方法可能是从 istream 中读取整个字符串 然后检查是否满足所有要求。
我的问题是字符串是否无效。 据我所知,在 C++ 中流是不变的是很常见的。
在这种情况下恢复 istream 的最佳做法是什么? 下面例子中的异常处理够吗?
std::istream& operator>>(std::istream& is, Foo& f)
{
std::string str;
if (is >> str)
{
// check if string is valid
if ( is_valid( str ) )
{
// set new values in f
}
else
{
// recover stream
std::for_each(str.rbegin(), str.rend(),
[&] (char c)
{
is.putback(c);
});
// ste failbit
is.clear(std::ios_base::failbit);
}
}
return is;
}
那么 std::getline() 而不是 is >> str 呢?还有其他陷阱吗?
谢谢
马可
【问题讨论】:
-
不,如果流不支持(无限)多次放回或向后搜索,则无法将流恢复到其初始状态。