如何使用 ifstream 正确从文件中读取 unsigned int 变量?

2024-04-18

我的代码从文本文件中读取 unsigned int 变量Input_File_Name.

unsigned int Column_Count; //Cols
unsigned int Row_Count;//Rows

try {
    ifstream input_stream;
    input_stream.open(Input_File_Name,ios_base::in);
    if (input_stream) {
        //if file is opened
        input_stream.exceptions(ios::badbit | ios::failbit);
        input_stream>>Row_Count;
        input_stream>>Column_Count;


    } else {
        throw std::ios::failure("Can't open input file");
        //cout << "Error: Can't open input file" << endl;
    }

} catch (const ios::failure& error) {
    cout << "Oh No!!" << error.what() << endl;          
} catch (const exception& error) {
    cout << error.what() <<"Oh No!!" << endl;
} catch (...) {
    cout << "Unknown exception" << endl;
}

效果非常好。 但是当我用错误的数据填充文本文件时

33abcd4  567fg8

它的工作原理是这样的:

input_stream>>Row_Count; //Row_Count = 33;
input_stream>>Column_Count; // throws an ios::failure exception

为什么没有这条线input_stream>>Row_Count;抛出异常? 据我了解, input_stream 将任何非数字符号视为分隔符,下一步它会尝试读取“abcd”。是这样吗? 如何设置空格符号作为分隔符来抛出ios::failure这行代码的异常input_stream>>Row_Count;在阅读“33abcd4”时?


如果流可以读取任何整数值,则整数值的正常提取会成功。也就是说,如果至少有一位数字可选地后跟任何内容,则整数读取成功。正常的提取操作don't尝试阅读更多内容,特别是他们不会尝试找到下一个空白。

从它的声音来看,您需要确保您的号码后面有一个空格,如果没有则失败。我可以想到两种不同的方法来做到这一点:

  1. 创建一个简单的操纵器,用于检查流是否位于空白字符上。然而,这意味着您将使用类似的方法来读取您的值in >> value >> is_space.
  2. 创建自定义std::num_get<char>侧面,将其安装到std::locale, and imbue() this std::locale进入您的信息流。它涉及更多一些,但不需要对整数的读取方式进行任何更改。

创建这样的操纵器相当简单:

std::istream& is_space(std::istream& in)
{
    if (!std::isspace(in.peek()))
    {
        in.setstate(std::ios_base::failbit);
    }
    return in;
}

现在,改变数字的读取方式更有趣,我怀疑我刚刚命名了许多大多数人都不太了解的标准库类。因此,让我们也快速为此键入一个示例。我会改变std::num_get<char>只处理方面unsigned int:要对其他整数类型执行此操作,需要重写更多函数。所以,这里有一个替代品std::num_get<char> facet:

class num_get:
    public std::num_get<char>
{
    iter_type do_get(iter_type it, iter_type end,
                     std::ios_base& ios, std::ios_base::iostate& err,
                     unsigned int& value) const
    {
        it = std::num_get<char>::do_get(it, end, ios, err, value);
        if (it != end && !isspace(static_cast<unsigned char>(*it)))
        {
            err |= std::ios_base::failbit;
        }
        return it;
    }
};

所有这一切都是从派生一个类std::num_get<char>并重写其虚拟函数之一。这个函数的实现相当简单:首先通过委托给基类来读取值(我刚刚意识到虚拟函数确实想要保护而不是像我过去那样私有,但这是一个完全不同的讨论) 。与是否成功无关(如果不成功,它将在 err 中设置错误状态),覆盖会检查是否有另一个可用字符,如果有,则检查它是否是空格,如果不是则设置一个std::ios_base::failbit在错误结果中err.

剩下的就是设置流以在std::locale并挂钩新的std::locale进入流:

std::locale loc(std::locale(), new num_get);
in.imbue(loc);

The std::locales 及其构面是内部引用计数的,即您不应该跟踪指向构面的指针,也不需要保留std::locale周围任一。如果觉得太麻烦imbue()所创造的std::locale或者你想在任何地方使用这个修改后的逻辑,你可以设置全局std::locale它用于初始化任何新创建的流以使用自定义std::num_get<char> facet.

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

如何使用 ifstream 正确从文件中读取 unsigned int 变量? 的相关文章

随机推荐

  • 使用 PHPUnit 和 Selenium 设置测试

    您能帮我设置测试环境吗 我在 Ubuntu 上运行 安装了 并运行 selenium Web 服务器 并通过 PHPUnit 执行我的测试 最有可能的是我陷入了一些小错误 但我现在不知道如何修复它 我的代码很简单 class WebTest
  • WPF Square 自动调整父容器大小

    我有一个UniformGrid我的 WPF 项目中的对象有 2 行和 3 列 其宽度和高度设置为自动 两种对齐方式都设置为拉伸 该网格将容纳 6squares我想尽可能多地填充他们的单元格 并水平和垂直居中 我需要添加什么才能允许方块根据父
  • 如何在localStorage中存储数组?

    我有一个数据属性 data return playWord baseWord result 并回应 baseWord Amazing 每次我在 api 中发送新请求时 基本词都会发生变化 我想将每个数据存储在本地存储中并将字符串值发送到 a
  • 具有区域格式的 NSDateFormatter

    我使用此代码来处理来自 json feed 的日期字符串 NSDateFormatter formatter NSDateFormatter alloc init formatter setDateStyle NSDateFormatter
  • 如何让 gif 动画在 WPF 中工作?

    我应该使用什么控制类型 Image MediaElement etc 我无法得到这个问题的最流行的答案 上面由达里奥 正常工作 结果是奇怪的 断断续续的动画和奇怪的伪影 到目前为止我找到的最佳解决方案 https github com Xa
  • Hibernate:是否可以在二级缓存中保存瞬态字段?

    我需要跟踪持久实体的字段 该字段会经常更改 并且实际上并不是该实体的功能 而是某种计算 有时 用户希望查看该计算结果 但这种情况非常罕见 每月一次左右 因此 必须以某种方式保存此计算的结果 但我想避免每次更改时都将其保存在数据库中 因为这每
  • “找不到类‘android.support.v4.app.FragmentActivity’”错误

    我收到以下错误 gt 02 06 23 10 24 104 E dalvikvm 912 Could not find class gt android support v4 app FragmentActivity referenced
  • 如何使用SVM求精确率、召回率、准确率?

    重复计算 Precision Recall 和 F Score https stackoverflow com questions 16927964 how to calculate precision recall and f score
  • 在 Yii 的视图中我应该更喜欢使用 widget 还是 renderPartial?

    当我应该在视图文件中使用自定义小部件或 renderPartial 时 我很困惑 有时我使用 widget 有时我使用 renderPartial Widget You use widget当您的应用程序逻辑定义在单独的类文件并且逻辑在某种
  • 将 C 字符串数组传递给 Fortran (iso_c_binding)

    如何传递 C 字符串数组 char cstrings 到 Fortran 子程序 问题使用 iso c binding 的 fortran C 桥接器中的字符串数组 https stackoverflow com questions 968
  • 在 Windows 上使用 PHP 获取总可用系统内存

    使用 PHP 我想获取系统可用的总内存 而不仅仅是空闲或已用内存 在 Linux 上 这非常简单 你可以做 memory fopen proc meminfo 然后解析该文件 有人知道 Windows 的等效方法吗 我愿意接受任何建议 编辑
  • 通过 UIPanGestureRecognizer 传递点击

    我想检测整个屏幕上的滑动 但是 屏幕包含UIButtons 如果用户点击这些按钮之一 我希望触发 Touch Up Inside 事件 我创建了一个UIView在我的屏幕顶部 并添加了一个UIPanGestureRecognizer在其上检
  • Qt 线程阻止 UI 响应

    我想我可能误解了Qt线程中的几个概念 在我的窗口类中 它派生自 QWidget class Widget Q OBJECT public Widget Widget QObject parent 0 QObject parent moveT
  • XNA 数字锁定影响输入

    我有一个中断 在键盘按键上给我协调键 当数字锁打开时 按键会显示为 Numpad1 Numpad2 等 当数字锁关闭时 数字键盘键会变成 End Left Right Up PageLock 我不能让这种情况发生 因为我需要将这些键 左 右
  • 确定 iPhone 上的互联网可用性?

    我在 iPhone 应用程序中使用 NSURLConnection 如下所示 NSURLConnection conn NSURLConnection alloc initWithRequest request delegate self
  • 有没有办法简化 C# 中的反射委托代码?

    In this https stackoverflow com a 12867132 171121回应 我想出了以下辅助方法 可以被不同的人重用Task创建者将事件转换为任务完成源 Helper method static Task
  • PySpark,Win10 - 系统找不到指定的路径

    我之前将 PySpark 作为通过 pip 安装的 Python 包安装 最近我使用干净版本的 Python 卸载了它并下载了独立版本 在我的用户变量中 我创建了一个名为 SPARK HOME 的路径 值为 C spark 2 3 2 bi
  • 尝试在 iPhone 上调试应用程序时收到消息“已添加、修改或删除签名资源”

    在尝试在 iPhone 设备上调试使用 3 2 SDK 创建的版本时 我收到消息 已添加 修改或删除了签名资源 我可以清理 重建 然后安装 不会出现错误 但如果我尝试在不清理的情况下安装 则会显示错误 任何人都知道可能是什么原因造成的 我找
  • Jenkins/Apache 反向代理错误

    根据我的搜索 我遇到了一个似乎相当常见的问题 但是我已按照我遇到的所有说明和 或修复进行操作 但没有一个对我有用 所以我问这个希望有人可以引导我走向正确的方向 我在 OS X 10 11 2 上通过 Homebrew 安装了 Jenkins
  • 如何使用 ifstream 正确从文件中读取 unsigned int 变量?

    我的代码从文本文件中读取 unsigned int 变量Input File Name unsigned int Column Count Cols unsigned int Row Count Rows try ifstream inpu