为什么 in.good() 与 !in.fail() 不同?
Why isn't in.good() the same as !in.fail()?
我读到以下内容是一种反模式:
while(in.good()) {
// ...
}
但这是首选:
while(operation) {
}
但是,流有一个返回 !fail()
的 bool 转换运算符。!fail()
不是和good()
一样吗?如果不是,为什么这两个函数不对称?我希望它类似于true == !false
.
http://en.cppreference.com/w/cpp/io/basic_ios/good 有一个很好的表格,解释了std::istream
的状态以及各种函数返回的值。
while ( stream.good() )
和while(stream)
的唯一不同时间是成功读取流的内容并达到EOF时。那时,stream.good()
返回true
,而(bool)stream
的计算结果为false.
如果上一个读取操作成功而没有遇到EOF,则in.good()
为真。(即使读取操作成功,也可能遇到 EOF。因此,如果in.good()
为 false,则上一个读取操作失败(在这种情况下,下一个读取操作也将失败(或遇到 EOF(在这种情况下,下一个读取操作也将失败(。因此,如果in.good()
为 false,则下一次读取操作肯定会失败。如果我们想知道是否值得尝试执行读取操作,我们应该测试 in.good()
.
但in.good()
是真的这一事实并不能保证任何事情。假设in
以空格结尾,这通常是这种情况,因为文本文件需要以换行符结尾。格式化读取操作在第一个空格字符处停止,并将其unget
回输入流中,因此,如果上一个读取操作读取最后一个数据项,它仍然不会在 EOF 处离开流,并且in
仍将good
。[见注1]。因此,如果您的循环如下所示:
while (in.good()) {
in >> x;
/* Do something with x assuming that it is valid */
}
然后,您不会注意到最后一个in >> x
何时失败,并且最终将在最后一个循环中使用未定义的值 x
。(可能最后一个值将被处理两次。
如果您的循环while (!in.bad())
或while (!in.eof())
,也会发生同样的事情。
你真正想要的是检查in >> x
是否成功。没有别的。而经典的方法是:
while (in >> x) {
/* If we get here, x has a legitimate value */
...
}
in >> x
只返回in
,所以这完全等同于
while (in >> x, in) {
/* ... */
}
换句话说,bool(in)
false
上一个操作失败的时间,true
成功时精确。这与in.good()
不同,因为我们(还(不想测试是否遇到了EOF。
笔记:
- 如第一段所述,读取可以成功并设置 EOF。可能发生的一种方式是文件不以换行符结尾。这种情况非常罕见,但你不应该排除它。事实上,它可能会发生,这正是
in.bad()
不检查 eof 标志的原因:in.bad()
false 肯定意味着之前的读取操作失败。
in.good(( 等于: [iOS 文档]
! ( in.eof() || in.fail() || in.bad() )
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 从不同线程使用int64的不同字节安全吗
- valgrind-hellgrind与泄漏检查的结果不同
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- netcat command in c++
- Difference in displaying cv2 Mat
- 函数向量_指针有不同的原型,我可以构建一个吗
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 访问者访问变体并返回不同类型时出错
- #为""定义宏;静态";针对不同的上下文
- 不同翻译单元中不可重载的非内联函数定义
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过继承类使用来自不同命名空间的运算符
- 我想做一个彼此不同但重复出现的数字
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 大小相等但成员数量不同的结构之间的性能差异
- 如何让集合 in C++过滤掉指向相同值的不同指针
- "==" in C++ 为相同的双打提供_有时_不同的结果
- 为什么 in.good() 与 !in.fail() 不同?