在 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 >> val) /* success */
习惯用法。
设置失败位可能比异常更好,因为它反映了标准类型如何与流一起播放。
确实如此。通常,在发现故障位已设置在此低级别后,您会从其他地方抛出异常。
@JackLloyd,我通常为operator >>(in, custom_type& c)
编写这样的代码:if ((in >> member1) && (in >> member2)) c = custom_typemove(member1), move(member2); else in.setstate(std::ios::failbit); return in;
。当这样写时,您可以将custom_type
嵌入到另一个对象中并使用类似的实现来读取(它可以很好地堆叠)。我喜欢它的原因是,'if' 比 'try/catch' 块(对于客户端代码)更容易编写 - 它施加的限制更少。以上是关于在 C++ 中,您可以手动设置流的故障位吗?如何?的主要内容,如果未能解决你的问题,请参考以下文章