Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有人真的使用流提取操作符吗?_C++_Iostream_Formatted Input - Fatal编程技术网

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;