gpt4 book ai didi

c++ - basic_ios 上标志的语义

转载 作者:IT老高 更新时间:2023-10-28 12:50:47 25 4
gpt4 key购买 nike

我发现自己对 rdstate() 标志反复感到困惑 - good()bad()eof() fail() - 以及它们在 basic_ios::operator!operator booloperator void 中的表达方式*

谁能让我摆脱痛苦并解释一下,这样我就不必再三思了?

最佳答案

有三个标志指示错误状态:

  • badbit 表示流出现了严重问题。它可能是缓冲区错误或向流提供数据的任何错误。如果设置了此标志,您可能不会再使用该流。

  • failbit 表示从流中提取或读取失败(或输出流的写入或插入),您需要注意该失败。

  • eofbit 表示输入流已经结束,没有什么可读取的了。请注意,这仅在您尝试从已到达其末尾的输入流中读取之后设置(即,当您尝试读取不存在的数据而发生错误时设置它)。

failbit 也可能由许多到达 EOF 的操作设置。例如,如果流中只剩下空白并且您尝试读取 int,那么您将同时到达 EOF,并且您将无法读取 int,因此两个标志都将被设置。

fail() 函数测试badbit ||故障位.

good() 函数测试 !(badbit || failbit || eofbit)。也就是说,当没有设置任何位时,流是好的。

您可以使用 ios::clear() 成员函数重置标志;这允许您设置任何错误标志;默认情况下(不带参数),它会清除所有三个标志。

流不会重载 operator bool(); operator void*() 用于实现安全 bool 惯用语的一些损坏版本。如果设置了 badbitfailbit,则此运算符重载返回 null,否则返回非 null。您可以使用它来支持测试提取是否成功作为循环或其他控制流语句的条件的习惯用法:

if (std::cin >> x) {
// extraction succeeded
}
else {
// extraction failed
}

operator!() 重载与 operator void*() 相反;如果设置了 badbitfailbit,则返回 true,否则返回 falseoperator!() 重载不再需要了;它可以追溯到完全一致地支持运算符重载之前(参见 sbi 的问题 "Why does std::basic_ios overload the unary logical negation operator?")。

C++0x 修复了导致我们必须使用安全 bool 习惯用法的问题,因此在 C++0x 中,basic_ios 基类模板确实重载了 operator bool() 作为显式转换运算符;此运算符与当前 运算符 void*() 具有相同的语义。

关于c++ - basic_ios 上标志的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4258887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com