IOSTREAM Sentry 到达末尾时不会设置 failbit

iostream sentry doesn't set failbit when it has reached the end

提问人:FunkyBaby 提问时间:9/27/2017 最后编辑:FunkyBaby 更新时间:9/28/2017 访问量:627

问:

对于以下代码:

#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,然后检查 .sentryfail()

根据 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

C++ IOSTREAM

评论

0赞 chris 9/27/2017
在我看来很奇怪,在我要求流读取一个字符并且它读取一个字符后会返回 true。fail()
0赞 Retired Ninja 9/27/2017
您也可以/应该检查的返回值。get

答:

1赞 gsamaras 9/27/2017 #1

从 std::istream::tellg 的引用:

如果 member 返回 true,则函数返回 -1。fail

从 std::ios::fail 的引用:

检查是否设置了 failbitbadbit

如果为流设置了 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,如果你想接受我的答案,顺便说一句!:)