为什么stream::good 是错误的示例?

2024-01-27

我给出了一个答案,我想每次通过循环检查流的有效性here https://stackoverflow.com/a/28277950/2642059.

我原来使用的代码good看起来类似于:

ifstream foo("foo.txt");

while (foo.good()){
    string bar;
    getline(foo, bar);
    cout << bar << endl;
}

我立即被指出here https://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong并被告知永远不要测试good。显然这是我不明白的事情,但我想正确地执行我的文件 I/O。

我用几个例子测试了我的代码,但无法使good-测试代码失败。

首先(打印正确,以新行结尾):

bleck 1
布莱 1 2
blah
以新行结束

第二(打印正确,以最后一行结束):

bleck 1
布莱 1 2
blah
这不会以新行结束

第三个是一个空文件(打印正确,只有一个换行符。)

第四个是丢失的文件(这正确地没有打印任何内容。)

有人可以帮我举一个例子来证明why good- 不应该进行测试吗?


他们错了。口头禅是“永远不要测试”.eof()'.

  • 为什么循环条件内的 iostream::eof 被认为是错误的? https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong?s=1%7C5.4841

即使这个咒语也太过分了,因为两者都有助于在提取失败后诊断流的状态。

所以咒语应该更像是

不要使用good() or eof()在尝试进一步阅读之前检测 eof

同样适用于fail(), and bad()

当然stream.good可以在使用流之前有效地使用(例如,如果流是尚未成功打开的文件流)

然而,两者都非常非常经常abused检测输入的结束,但这不是它的工作原理。


为什么不应该使用此方法的典型示例:

std::istringstream stream("a");
char ch;
if (stream >> ch) {
   std::cout << "At eof? " << std::boolalpha << stream.eof() << "\n";
   std::cout << "good? " << std::boolalpha << stream.good() << "\n";
}

Prints

false
true

See it 住在科里鲁 http://coliru.stacked-crooked.com/a/e2eef88fdd223a37

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

为什么stream::good 是错误的示例? 的相关文章

随机推荐

  • Android 上 之间的区别

    我现在对两个明显元素之间的区别感到困惑 我认为仅使用 Google Play 会过滤掉不属于支持屏幕列表的设备 该应用程序不会显示在这些设备上的搜索结果中 我以为使用就足够了 但似乎不起作用 我也需要包含吗 有人可以向我解释自然语言的区别吗
  • 如何通过jquery从数据库接收数据? [wordpress.js]

    我正在尝试从 WordPress 主题的 js 文件中的数据库中获取一些数据 我尝试使用 jquery 的 post 但没有任何反应 还请建议我任何替代方案 js 文件中的代码 jq post abc php name kumar accI
  • 磁带平衡 Codility 培训计划

    我在 Codility 中提交了磁带平衡问题的解决方案 礼貌培训 1 问题描述如下 给出一个由 N 个整数组成的非空零索引数组 A 数组 A 代表磁带上的数字 任何整数 P 使得 0 我提交的解决方案是 class Solution pub
  • 我怎样才能避免codeigniter中的URL中的index.php [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在使用 apache 服务器 我
  • extern "C" 带有类和 DLL

    我得到了一个 C DLL 源代码 它使用extern C extern C class Something public declspec dllexport Something declspec dllexport virtual Som
  • 读取 Parquet 文件时是什么控制分区数量?

    我的设置 两个 Spark 集群 一份在 EC2 上 一份在 Amazon EMR 上 两者均使用 Spark 1 3 1 EMR集群已安装emr 引导操作 https github com awslabs emr bootstrap ac
  • play框架2.0支持memcached吗?

    我阅读了 Play Framework 2 0 文档 但没有任何关于 memcached 的文字 如何在 Play Framework 2 0 中使用 memcached 为什么在2 0中消失 在1 x中 这很容易 正如评论中已经指出的 默
  • 当 Jenkins 安装在登台服务器上时,如何在本地访问 Jenkins 仪表板?

    我已经通过 putty 在我的项目 网站 的 Ubuntu 临时服务器上安装了 Jenkins 就像我在 WINDOWS7 上一样 我启动了它并检查它是否在那里运行 但是当尝试访问时http staging website com 8080
  • 使用 Javascript 将类添加到每个第三个元素

    我正在尝试使用 javascript 选择父级的每三个元素并向其添加一个 css 类 对我来说听起来很简单 但我无法让它发挥作用 我发现this https stackoverflow com questions 4274673 javas
  • 多实例模式的 C++ 模板类实现

    我使用 C 中的模板类实现了 multiton 模式 ifndef MULTITON H define MULTITON H include
  • 从自动旋转动画中排除 UIView

    TL DR 需要保持自动旋转 但在方向改变时排除一个 UIView 自动旋转 如何 背景故事 我需要在动画过程中保持 UIView 静止并伴随自动旋转 这发生在方向改变时 类似于 iOS 相机应用程序处理旋转的方式 即控件在其位置旋转 我尝
  • 在C#中调用exe程序

    如何从一个 C 文件调用另一个 C 文件生成的 exe using System Diagnostics string command C tmp myExe exe my params ProcessStartInfo procStart
  • 如何启动一个线程来保持GUI刷新?

    我有一个带有按钮的窗口 它会触发冗长的处理 我将处理放在一个单独的线程中 但令我惊讶的是 它无论如何都会使 GUI 冻结 没有控件刷新 我什至无法移动窗口 So 问题是如何启动线程 这样它就不会干扰GUI 即GUI将始终是最新的 在处理时我
  • Laravel 订单按 whereHas

    这个问题与 Laravel 5 3 Eloquent 关系问题 https stackoverflow com questions 41123931 laravel 5 3 eloquent relationship issue 请访问此网
  • babel vs babel-core vs babel-loader vs babel-preset-2015 vs babel-preset-react vs babel-polyfill

    我正在为我的 React 项目设置 Webpack 并对两者感到困惑babel babel core babel loader babel preset 2015 and babel preset react 我知道需要 Babel 将 E
  • Mathematica 表达式开头的非交换乘法和负系数

    在一些非常友善的 stackoverflow 贡献者的帮助下在这篇文章中 https stackoverflow com questions 5023863 redefine noncommutative multiplication in
  • 如何在 Codeigniter 中创建小部件系统

    我正在 Codeigniter 中创建一个自定义 CMS 并且我想要一个类似于 Wordpress 中使用的小部件系统 例如 我想要一个小部件 显示侧边栏上显示的最后 5 篇帖子 我还希望能够逐页控制此小部件显示的页面 我在用Phil St
  • 制作频率表

    我应该创建一个包含 256 个 DWORD 的频率表 并使用 ASCII 代码作为索引来计算字符串中字符出现的次数 我陷入了如何使用存储的 ASCII 值作为索引并增加该索引的困境 这是我到目前为止所拥有的 TITLE String Fin
  • jsf 2.2(最终版)不适用于 Jboss 7.1.1

    在我看来 JSF 2 2 在 JBoss 7 1 1 上根本不起作用 使用 jboss 的 multi jsf 我只是用 jsf 2 2 的相应 jar 替换了 jsf api 和 jsf 实现模块 当我的应用程序启动时 我看到以下错误 0
  • 为什么stream::good 是错误的示例?

    我给出了一个答案 我想每次通过循环检查流的有效性here https stackoverflow com a 28277950 2642059 我原来使用的代码good看起来类似于 ifstream foo foo txt while fo