为什么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 是错误的示例? 的相关文章

  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 使用 C# 读取 Soap 消息

  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单

随机推荐

  • 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