提问人:FunkyBaby 提问时间:9/27/2017 最后编辑:FunkyBaby 更新时间:9/28/2017 访问量:627
IOSTREAM Sentry 到达末尾时不会设置 failbit
iostream sentry doesn't set failbit when it has reached the end
问:
对于以下代码:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
istringstream iss("a");
iss.get();
cout << iss.tellg() << endl; // 1
cout << iss.fail() << endl; // 0
}
我希望结果是 -1,1 而不是 1, 0。
tellg
将首先构造 A,然后检查 .sentry
fail()
根据 http://eel.is/c++draft/istream::sentry#2
如果 is.rdbuf()->sbumpc() 或 is.rdbuf()->sgetc() 返回 traits::eof(),函数调用 setState(failbit | eofbit) (其中 可能会引发 ios_base::failure)。
所以应该是 true,并且应该返回 -1。fail()
tellg
答:
1赞
gsamaras
9/27/2017
#1
从 std::istream::tellg
的引用:
如果 member 返回 true,则函数返回 -1。
fail
从 std::ios::fail
的引用:
检查是否设置
了 failbit
或badbit
如果为流设置了 failbit 或 badbit 错误状态标志之一(或两者),则返回 true。
当在 输入操作。
使用此代码进行检查:
#include <iostream>
#include <sstream>
using namespace std;
int main() {
istringstream iss("a");
iss.get();
cout << iss.fail() << endl; // 0
cout << iss.tellg() << endl; // 1
cout << iss.eof() << endl; // 0
}
评论
0赞
FunkyBaby
9/27/2017
因此,这就是 Sentry 没有正确设置 failbit |eofbit。
0赞
gsamaras
9/29/2017
是的,@FunkyBaby,如果你想接受我的答案,顺便说一句!:)
评论
fail()
get