C++ IOS::setstate() 函数



C++ 的std::ios::setstate()函数用于修改输入/输出流的状态。它设置流的内部状态标志,例如 badbit、failbit、eofbit,这些标志指示各种错误情况,例如读/写错误、操作失败或 EOF。此函数通过使程序能够在执行 I/O 操作后检查和响应流的状态来帮助进行错误处理。

语法

以下是 std::ios::setstate() 函数的语法。

void setstate (iostate state);

参数

  • state − 一个 ios_base::iostate 类型的对象,其值可以是以下成员常量的任意组合。

iostate

(成员常量)

指示 用于检查状态标志的函数
good() eof() fail() bad() rdstate()
goodbit 无错误(零值 iostate true false false false goodbit
eofbit 输入操作到达文件结尾 false true false false eofbit
failbitI/O 操作的逻辑错误 false false true false failbit
badbitI/O 操作的读/写错误 false false true true badbit

返回值

它不返回任何值。

异常

如果抛出异常,则流处于有效状态。如果结果错误状态标志不是 goodbit,并且为该状态设置了成员异常 throw,则它会抛出成员类型 failure 的异常。

数据竞争

修改流对象。

同时访问同一个流对象可能会导致数据竞争。

示例

让我们看下面的例子,我们将手动设置输入流的 failbit 来模拟输入失败。

#include <iostream>
#include <sstream>
int main()
{
    std::istringstream a("112 ABC");
    int x;
    a >> x;
    std::cout << "First Read: " << x << std::endl;
    a.setstate(std::ios::failbit);
    a >> x;
    if (a.fail()) {
        std::cout << "Second Read Failed Due Do setstate()" << std::endl;
    }
    return 0;
}

输出

以上代码的输出如下:

First Read: 112
Second Read Failed Due Do setstate()

示例

考虑以下示例,我们将组合 failbit 和 eofbit。

#include <iostream>
#include <sstream>
int main()
{
    std::istringstream a("112");
    int x;
    a >> x;
    std::cout << "First Read: " << x << std::endl;
    a.setstate(std::ios::failbit | std::ios::eofbit);
    a >> x;
    if (a.fail() && a.eof()) {
        std::cout << "Second Read Failed Due To setstate() With eofbit." << std::endl;
    }
    return 0;
}

输出

以下是以上代码的输出:

First Read: 112
Second Read Failed Due To setstate() With eofbit.

示例

在下面的示例中,我们将清除 goodbit 来模拟流不再处于良好状态。

#include <iostream>
#include <sstream>
int main()
{
    std::istringstream x("1213");
    int a;
    x >> a;
    std::cout << "First Read: " << a << std::endl;
    x.setstate(std::ios::goodbit);
    x >> a;
    std::cout << "Second Read: " << a << std::endl;
    return 0;
}

输出

如果我们运行以上代码,它将生成以下输出:

First Read: 1213
Second Read: 1213
ios.htm
广告