C++ 有人真的使用流提取操作符吗?
我已经在实代码中编写了大量的C++ 有人真的使用流提取操作符吗?,c++,iostream,formatted-input,C++,Iostream,Formatted Input,我已经在实代码中编写了大量的操作符>(std::istream&,T&)函数,甚至对内置类型使用了提取操作符(好的,可能用于std::string)。这些仅适用于简短的示例课程和教科书吗?运算符> C++的失败特征 有人就这一问题提出了问题。我想知道的是,在实践中是否有人这样做 即使是像这样简单的事情,我也不能建议使用operator>。编写在检测和处理输入错误(或者我不知道如何)方面具有健壮性的代码太难了 如果您不同意,请给出一个使用操作符>的好例子——也许可以回答我链接到的最后一个问题。
操作符>(std::istream&,T&)
函数,甚至对内置类型使用了提取操作符(好的,可能用于std::string
)。这些仅适用于简短的示例课程和教科书吗?<代码>运算符> <代码> C++的失败特征
有人就这一问题提出了问题。我想知道的是,在实践中是否有人这样做
即使是像这样简单的事情,我也不能建议使用operator>
。编写在检测和处理输入错误(或者我不知道如何)方面具有健壮性的代码太难了
如果您不同意,请给出一个使用操作符>
的好例子——也许可以回答我链接到的最后一个问题。
Wrapup:谢谢大家的回复,有很多好的意见。Manuel的回答让我重新考虑我不愿意使用
op>
,所以我接受了它。值的打印频率比读取频率高,所以运算符的使用频率比codeoperator>高。
。然而,如果您想读取值,操作符>>
非常有用
您必须检查错误并不是特定于
运算符>>
,显然,任何其他读取值的方法都必须以某种方式检测无效输入。我大量使用运算符>。我不知道最初是谁提出的,但它吸引了足够多的人,以至于它出现在了API中
例如:
dbSorter arcSort;//申报分拣机
arcSort Date>解析流中的整个数据。运算符>>基本上是反序列化。在我有限的和轶事的经验中,C++中的大多数序列化/反序列化都比流库低。它不必在较低的级别上实现——通常就是这样
实现自定义反序列化并不总是一个小问题,但即使不使用流提取语法实现,也可能会遇到同样的问题
下面是流提取操作符的一个简单用法,它至少有点用处:
在这个有限的范围内,正确的用法似乎相当简单。是的,我确实使用运算符>>(虽然不像运算符那样频繁地解析字符串(如“apple”、“banana”等),以获得正确的枚举值
std::istream &operator>>(std::istream &is, Fruit &fruit)
{
std::string str;
is >> str;
if (str == "apple")
fruit = APPLE;
else if (str == "banana")
fruit = BANANA;
// other fruits
else
is.setstate(std::ios::failbit);
return is;
}
另请注意,在遇到未知字符串时,在istream上使用setstate方法设置流的故障状态。使用此运算符时,可以按如下方式检查流的故障状态:
Fruit fruit;
std::cin >> fruit;
if (std::cin.fail())
std::cout << "Error: Unknown Fruit!" << std::endl;
水果;
水果;
if(std::cin.fail())
std::cout我从不写它们,也很少使用“内置的”一个。提取运算符对于读取交互式用户输入非常无用,因为流太容易坏。编写自定义解析例程几乎总是更容易、更健壮。而在序列化方面,如果我想将某些内容保存为文本,我会使用行业标准格式,如XML,extrac异常运算符显然不适合读取。否则,我将数据存储在数据库或二进制文件中,这再次不适合与提取器一起使用。运算符>>
在将文本形式的数字转换为内部表示时很有用
它在为对象加载数据时也很有用。与不能为不同类型重载的scanf
不同,对象可以重载operator>
。因此,它为加载对象提供了更多的数据隐藏,内部表示形式不需要知道就可以将数据读入对象中。我认为stream ext当与STL算法(如std::copy
和std::istream\u迭代器
类)结合使用时,ractor运算符非常有用
阅读以了解我在说什么。好的,但那不是一个istream提取器。我使用op>>编写封送处理代码,在那里我可以完全控制输入/输出,任何错误都是致命的。但我从来没有发现它对文本处理有用。我只是纠正了自己-OOFILE使用操作符>>调用virtu的传统模式用于表和字段的al insert方法。这是一个有趣的示例,因为它将字符串
放入istringstream
。结果是,如果出现解析失败,原始输入可以显示给用户。而如果代码直接从istream
读取,则在失败发生时,显示错误的输入已经太迟了。文件和网络流也是有用的例子。在字节流级别实现任何类型的反序列化都会很麻烦,除非您的需求非常基本。对于更大的需求,您应该设计一个协议,然后实现它。特定的错误处理(也许错误恢复和/或数据冗余)可以在中进行设计,在这种情况下,代码就会变得明显。我喜欢这种技术。我会有时间尝试一下。如果要支持词法转换,您需要定义op>
)。
Fruit fruit;
std::cin >> fruit;
if (std::cin.fail())
std::cout << "Error: Unknown Fruit!" << std::endl;