rdstate()返回值是什么意思?

2024-05-11

istream& Read(istream &is)
{
    std::string buf;
    while (is >> buf)       
    {   
        cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
        cout << is.rdstate() << endl;
        cout << buf << endl;
    }
    cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
    cout << is.rdstate() << endl;
    is.clear();
    cout << is.eofbit << " " << is.failbit << " " << is.badbit << endl;
    cout << is.rdstate() << endl;
    return is;
}

如果我输入“test”等普通字符,输出为1 2 4 0.
然后我输入 CTRL+Z (Windows),输出是1 2 4 3 1 2 4 0.

问题 : 1. 做什么rdstate()返回值是什么意思? (为什么它输出3,而不是2?不是1?)

  1. 为什么不is.eofbitand is.failbit我输入 CTRL+Z 后会发生变化吗? (作为C++ 入门第五版说,到达文件结尾同时设置 eofbit 和 failurebit )

会员std::ios::rdstate()简单地返回状态标志的组合std::ios_base::badbit, std::ios_base::eofbit, and std::ios_base::failbit。在哪些条件下设置哪些位并不完全一致,但其意图如下:

  1. std::ios_base::badbit当流真正处于功能失调状态并且您[可能]不会从中得到任何东西时,就会设置该值。例如,如果没有流缓冲区或流上的任何操作引发异常,则设置此标志。
  2. std::ios_base::failbit当输入操作失败时设置,例如,因为格式化输入操作获得了意外的字符。通过清除该错误、忽略几个字符并重试,也许可以从该错误中恢复。
  3. std::ios_base::eofbit当达到[当前] EOF 时(即暂时无法提取更多字符时)被设置。

现在,在您的情况下,您输入了一个字符串并成功读取它,即没有设置标志。请注意,阅读以换行符停止,即您确实输入了"test\n"流提取了这五个字符。当您结束流时,流在尝试读取字符串时达到 EOF,即,它设置std::ios_base::eofbit and输入失败也设置std::ios_base::failbit.

如果你只想看std::ios_base::eofbit设置,您可以通过使用以流末尾的单词结尾且没有任何后续空格字符的流来执行此操作。获得这样的流的一个简单方法是使用std::istringstream并从中读出:

std::istringstream in("test");
Read(in);

另一个简单的设置是看std::ios_base::badbit设置:您只需创建一个没有流缓冲区的流,例如:

std::istream in(0);
Read(in);

请注意,该流最初将具有std::ios_base::badbit设置并获得std::ios_base::failbit尝试读取字符时设置。后clear()ing the std::ios_base::badbit但仍将被设置。

To get std::ios_base::failbit设置而不同时具有std::ios_base::eofbit设置您需要防止它看到非空白字符:输入运算符std::string默认情况下,开始时会跳过空格,然后读取,直到到达空格或 EOF,如果可以读取至少一个非空格字符,则说明成功。一种方法是关闭自动跳过空白,例如:

std::istringstream in("test test");
Read(in >> std::noskipws);

顺便说一句,请注意,不能保证以下值std::ios_base::eofbit, std::ios_base::failbit, or std::ios_base::badbit除了它们可以以某种形式用作位掩码之外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rdstate()返回值是什么意思? 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐