c++11 标准模板(STL)(std::basic_ios)(三)

定义于头文件 <ios>

template<

    class CharT,
    class Traits = std::char_traits<CharT>

> class basic_ios : public std::ios_base

类 std::basic_ios 提供设施,以对拥有 std::basic_streambuf 接口的对象赋予接口。数个 std::basic_ios 对象能指涉一个实际的 std::basic_streambuf 对象。

继承图

还提供了两个对常见的字符类型的特化:

类型 定义
ios basic_ios<char>
wios basic_ios<wchar_t>


状态函数

检查是否没有发生错误,例如是否可执行I/O操作

std::basic_ios<CharT,Traits>::good

bool good() const;

若流上的最近 I/O 操作成功完成则返回 true 。特别是返回 rdstate() == 0 的结果。

设置流状态位的条件列表,见 ios_base::iostate 。

参数

(无)

返回值

若流未出现错误则为 true ,否则为 false 。

检查是否到达了文件末尾

std::basic_ios<CharT,Traits>::eof

bool eof() const;

若关联流已抵达文件尾则返回 true 。尤其是若 rdstate() 中设置了 eofbit 则返回 true 。

设置 eofbit 的条件列表见 ios_base::iostate 。

参数

(无)

返回值

若遇到文件尾条件则为 true ,否则为 false 。

注意

此函数只报告最近的 I/O 操作所设置的流状态;它不检测关联的数据源。例如,若最近的 I/O 为返回文件最后字节的 get() ,则 eof() 返回 false 。下个 get() 无法读取任何内容,并设置 eofbit 。之后 eof() 才返回 true 。

典型使用中,输入流处理在任何错误上停止。然后能用 eof() 和 fail() 区别不同的错误条件。

检查是否发生了可恢复的错误

std::basic_ios<CharT,Traits>::fail

bool fail() const;

若关联流上已发生错误则返回 true 。特别是若 rdstate() 中设置了 badbitfailbit 则返回 true 。

设置 failbitbadbit 的条件列表见 ios_base::iostate 。

参数

(无)

返回值=

若已出现错误则为 true ,否则为 false 。

检查是否已发生不可恢复的错误

std::basic_ios<CharT,Traits>::bad

bool bad() const;

若关联的流上已出现不可恢复的错误则返回 true 。尤其是若 rdstate() 中设置了 badbit 则返回 true 。

设置 badbit 的条件列表见 ios_base::iostate 。

参数

(无)

返回值

若出现不可恢复的错误则为 true ,否则为 false 。

检查是否有错误发生(fail() 的同义词)

std::basic_ios<CharT,Traits>::operator!

bool operator!() const;

若关联流上已出现错误则返回 true 。特别是若 rdstate() 中设置了 failbitbadbit 则返回 true 。

参数

(无)

返回值

若已出现错误则为 true ,否则为 false 。

调用示例 

#include <iostream>
#include <fstream>
#include <cstdlib>

int main()
{
    std::ifstream file("test.txt");
    if (!file) // operator! 用于此
    {
        std::cout << "File opening failed\n";
        return EXIT_FAILURE;
    }

    // 典型的 C++ I/O 循环以 I/O 函数的返回值为循环控制条件,
    // operator bool() 用于此
    for (int n; file >> n;)
    {
        std::cout << n << ' ';
    }
    std::cout << '\n';

    if (file.bad())
    {
        std::cout << "I/O error while reading\n";
    }
    else if (file.eof())
    {
        std::cout << "End of file reached successfully\n";
    }
    else if (file.fail())
    {
        std::cout << "Non-integer data encountered\n";
    }
}

检查是否没有发生错误(!fail()的同义词)

std::basic_ios<CharT,Traits>::operator bool

operator void*() const;

(1) (C++11 前)

explicit operator bool() const;

(2) (C++11 起)

检查流是否无错误。

1) 若 fail() 返回 true 则返回空指针,否则返回非空指针。此指针可隐式转换为 bool ,并可用于布尔语境。

2) 若流无错误且已为 I/O 操作就绪则返回 true 。尤其是返回 !fail() 。

此运算符使得以流和返回到流引用的函数为循环条件可行,产生惯用的 C++ 输入循环,例如 while(stream >> value) {...} 或 while(getline(stream, string)){...} 。这种循环仅若输入操作成功才执行循环体。

参数

(无)

返回值

若流无错误则为 true ,否则为 false 。

 调用示例

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream s("1 2 3 error");
    int n;
    std::cout << std::boolalpha << "s is " << static_cast<bool>(s) << '\n';
    while (s >> n)
    {
        std::cout << n << '\n';
    }
    std::cout << "s is " << static_cast<bool>(s) << '\n';
}

返回状态标志

std::basic_ios<CharT,Traits>::rdstate

iostate rdstate() const;

返回当前错误状态。

参数

(无)

返回值

当前错误状态。它是位掩码类型,并且能是下列常量的组合:

常量 解释
goodbit 无错误
badbit 不可恢复的流错误
failbit 输入/输出操作失败(格式化或提取错误)
eofbit 关联的输出序列已抵达文件尾

调用示例

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream stream;

    if (stream.rdstate() == std::ios_base::goodbit)
    {
        std::cout << "stream state is goodbit\n";
    }

    stream.setstate(std::ios_base::eofbit);

    // 检查状态为准确的 eofbit (无 failbit 且无 badbit )
    if (stream.rdstate() == std::ios_base::eofbit)
    {
        std::cout << "stream state is eofbit\n";
    }
}

 

设置状态标志

std::basic_ios<CharT,Traits>::setstate

void setstate( iostate state );

在当前已设置表之外,设置流错误状态标志 state 。实质上调用 clear(rdstate() | state) 。可能抛出异常。

参数

state - 要设置的流错误状态标志。能为下列常量的组合:
常量 解释
goodbit 无错误
badbit 不可恢复的流错误
failbit 输入/输出操作失败(格式化或提取错误)
eofbit 关联的输出序列已抵达文件尾

返回值

(无)

调用示例

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream stream;

    if (!stream.fail())
    {
        std::cout << "stream is not fail\n";
    }

    stream.setstate(std::ios_base::failbit);

    if (stream.fail())
    {
        std::cout << "now stream is fail\n";
    }

    if (!stream.good())
    {
        std::cout << "and stream is not good\n";
    }
}

修改状态标志

std::basic_ios<CharT,Traits>::clear

void clear( std::ios_base::iostate state = std::ios_base::goodbit );

通过以 state 的值赋值,设置流错误状态标志。默认赋值 std::ios_base::goodbit ,它拥有的效果为清除所有错误状态标志。

若 rdbuf() 为空指针(即无关联的流缓冲),则赋值 state | badbit 。可能抛出异常。

参数

state - 新的错误状态标志设置。它能为下列常量的组合:
常量 解释
goodbit 无错误
badbit 不可恢复的流错误
failbit 输入/输出操作失败(格式化或提取错误)
eofbit 关联的输出序列已抵达文件尾

返回值

(无)

调用示例

#include <iostream>
#include <string>

int main()
{
    double n;
    while (std::cout << "Please, enter a number\n"
            && !(std::cin >> n))
    {
        std::cin.clear();
        std::string line;
        std::getline(std::cin, line);
        std::cout << "I am sorry, but '" << line << "' is not a number\n";
    }
    std::cout << "Thank you for entering the number " << n << '\n';
}

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/131276240