在 C++ 中,您可以手动设置流的故障位吗?如何?

Posted

技术标签:

【中文标题】在 C++ 中,您可以手动设置流的故障位吗?如何?【英文标题】:In C++, can you manually set the failbit of a stream? How? 【发布时间】:2010-12-11 01:38:29 【问题描述】:

我正在重载输入流运算符以与 Time 类一起使用,如果输入与我预期的时间格式 (hh:mm) 不匹配,我想手动设置输入流的故障位。这可以做到吗?怎么样?

谢谢!

【问题讨论】:

【参考方案1】:

是的,您可以使用ios::setstate 进行设置,如下所示:

#include <iostream>
#include <ios>

int main()
   
   std::cout << "Hi\n";

   std::cout.setstate(std::ios::failbit);

   std::cout << "Fail!\n";
   

不会产生第二个输出,因为cout 处于失败状态。

(对我来说,一个例外似乎更干净,但 YMMV)

【讨论】:

是的,输入和输出流都是从 ios 和 ios_base 派生的 我认为设置failbit 是报告流错误的一种非常有效的方法,因为客户端代码可以使用与基本类型相同的if (in &gt;&gt; val) /* success */ 习惯用法。 设置失败位可能比异常更好,因为它反映了标准类型如何与流一起播放。 确实如此。通常,在发现故障位已设置在此低级别后,您会从其他地方抛出异常。 @JackLloyd,我通常为operator &gt;&gt;(in, custom_type&amp; c) 编写这样的代码:if ((in &gt;&gt; member1) &amp;&amp; (in &gt;&gt; member2)) c = custom_typemove(member1), move(member2); else in.setstate(std::ios::failbit); return in;。当这样写时,您可以将custom_type 嵌入到另一个对象中并使用类似的实现来读取(它可以很好地堆叠)。我喜欢它的原因是,'if' 比 'try/catch' 块(对于客户端代码)更容易编写 - 它施加的限制更少。

以上是关于在 C++ 中,您可以手动设置流的故障位吗?如何?的主要内容,如果未能解决你的问题,请参考以下文章

流的操作如何选择流?

华为平板突然黑屏如何解决?

在 Windows 上调试 linux 故障转储

如何在 CrashRpt 中配置电子邮件设置以发送故障转储?

Neo4j:如何在社区版中设置故障转移

ipad怎么拉流