iostream sentry在到达终点时没有设置failbit

时间:2017-09-27 12:46:51

标签: c++ stream iostream

代码如下:

#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将首先构建sentry,然后检查fail()

根据http://eel.is/c++draft/istream::sentry#2

  

如果is.rdbuf() - &gt; sbumpc()或is.rdbuf() - &gt; sgetc()返回   traits :: eof(),函数调用setstate(failbit | eofbit)(其中   可能会抛出ios_base :: failure)。

所以fail()应为true,tellg应返回-1。

1 个答案:

答案 0 :(得分:1)

来自std::istream::tellg的参考:

  

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

来自std::ios::fail的参考:

  

检查failbitbadbit是否已设置

     

如果为流设置了failbit或badbit错误状态标志中的任何一个(或两者),则返回true。

     

在a期间发生错误时,至少设置其中一个标志   输入操作。

检查此代码:

#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
}