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

定义于头文件 

class ios_base;

ios_base 是作为所有 I/O 流类的基类工作的多用途类。它维护数种数据:

1) 状态信息:流状态标志;

2) 控制信息:控制输入和输出序列格式化和感染的本地环境的标志;

3) 私有存储:允许 long 和 void* 成员的有下标可扩展数据结构,它可以实现为二个任意长度的数组,或二元素结构体的单个数组,或另一容器;

4) 回调:从 imbue() 、 copyfmt() 和 ~ios_base() 调用的任意数量用户定义函数。

典型实现保有对应下列 fmtflags 、 iostate 、 openmode 及 seekdir 所有值的成员常量,维护当前精度、宽度、格式化标志、异常掩码、缓冲区错误状态、保有回调的可调大小容器、当前感染的 locale 、私有存储的成员变量及 xalloc() 所用的静态整数变量。

本地环境

设置本地环境

std::ios_base::imbue

std::locale imbue( const std::locale& loc );

设置流的关联本地环境为给定值。在返回前,以 imbue_event 为参数调用 register_callback() 所注册的每个函数。

参数

loc - 要关联到流的新 locale

返回值

操作前与流关联的 locale 对象。

返回当前本地环境

std::ios_base::getloc

std::locale getloc() const;

返回当前与流关联的 locale 。

参数

(无)

返回值

与流关联的 locale 对象。

内部可扩展数组

返回能安全用作 pword() 和 iword() 下标的程序范围内独有的整数

std::ios_base::xalloc

static int xalloc();

返回(程序范围内)唯一的值,它能用于通过调用 iword() 和 pword() 访问 std::ios_base 的私有存储中一个 long 和一个 void* 元素。到 xalloc 的调用不分配内存。

此函数线程安全;从多个线程共时访问不导致数据竞争。 (C++14 起)

等效地自增 std::ios_base 的私有静态数据成员,如同以执行 return index++; ,若 index 是该静态成员的名称(它可以为 std::atomic 或以其他方式以支持多线程共时访问) (C++14 起)。

参数

(无)

返回值

用作 pword/iword 下标的独有整数。

调用示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

template >
class mystream : public std::basic_ostream
{
public:
    static const int xindex;
    mystream(std::basic_ostream& ostr) :
        std::basic_ostream(ostr.rdbuf())
    {
        this->pword(xindex) = this;
    }

    void myfn()
    {
        *this << "[special handling for mystream]";
    }
};

// 每个 mystream 特化从 xalloc() 获得独有的下标
template
const int mystream::xindex = std::ios_base::xalloc();

// 此 I/O 操纵符将能用于辨识身为 mystream 的 ostream
// 通过查找存储于 pword 的指针
template
std::basic_ostream& mymanip(std::basic_ostream& os)
{
    if (os.pword(mystream::xindex) == &os)
    {
        static_cast&>(os).myfn();
    }
    return os;
}


int main()
{
    std::cout << "cout, narrow-character test " << mymanip << std::endl;

    mystream myout(std::cout);
    myout << "myout, narrow-character test " << mymanip << std::endl;

    std::wcout << "wcout, wide-character test " << mymanip << std::endl;

    mystream mywout(std::wcout);
    mywout << "mywout, wide-character test " << mymanip << std::endl;

    return 0;
}

输出

c++11 标准模板(STL)(std::ios_base)(三)_第1张图片

如果有必要的话,调整私有存储的大小,并且访问位于提供的下标的long元素

std::ios_base::iword

long& iword( int index );

首先,充分地分配或重置私有存储( long 的动态数组或另一可索引数据结构)以确保 index 是合法下标,然后返回到带下标 index 的私有存储 long 元素。

引用可能被此 ios_base 对象上任何其他操作非法化,包含另一对 iword() 的调用,但维持返回值,使得以相同下标从 iword(index) 读取将产生相同值(直至下次到 copyfmt() 的调用)。值能用于任何目的。必须通过先前的 xalloc() 调用获得元素下标,否则行为未定义。新元素初始化为 0 。

若分配失败,则调用可能抛出 std::ios_base::failure 的 std::basic_ios<>::setstate(badbit) 。

参数

index - 元素的下标值

返回值

到该元素的引用。

异常

设置 badbit 时可能抛出 std::ios_base::failure 。

调用示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

#include 
#include 

struct Foo
{
    static int foo_xalloc;
    std::string data;
    Foo(const std::string& s) : data(s) {}
};

// 分配 Foo 对象所用的 iword 存储
int Foo::foo_xalloc = std::ios_base::xalloc();

// 若 iword 保有 1 则此用户定义 operator<< 打印字符串
std::ostream& operator<<(std::ostream& os, Foo& f)
{
    if (os.iword(Foo::foo_xalloc) == 1)
    {
        return os << std::string(f.data.rbegin(), f.data.rend());
    }
    else
    {
        return os << f.data;
    }
}

// 此 I/O 操纵符在 0 与 1 间翻转存储于 iword 的数
std::ios_base& rev(std::ios_base& os)
{
    os.iword(Foo::foo_xalloc) = !os.iword(Foo::foo_xalloc);
    return os;
}

int main()
{
    Foo f("example");
    std::cout << f << '\n' << rev << f << '\n' << rev << f << '\n';
    return 0;
}

输出

c++11 标准模板(STL)(std::ios_base)(三)_第2张图片

 

若需要则重置私有存储的大小,并访问位于指定下标的 void* 元素

std::ios_base::pword

void*& pword( int index );

首先,充分地分配或重置私有存储( void* 的动态数组或另一可索引数据结构)以确保 index 是合法下标,然后返回到带下标 index 的私有存储 void* 元素。

引用可能被此 ios_base 对象上任何其他操作非法化,包含另一对 pword() 的调用,但维持返回值,使得以相同下标从 pword(index) 读取将产生相同值(直至下次到 copyfmt() 的调用)。值能用于任何目的。元素下标必须由 xalloc() 获得,否则行为未定义。初始化新元素为 NULL 。

若分配失败,则调用可能抛出 std::ios_base::failure 的 std::basic_ios<>::setstate(badbit) 。

参数

index - 元素的下标值

返回值

到该元素的引用。

异常

设置 badbit 时可能抛出 std::ios_base::failure 。

注意

若存储于 pword 的指针要求管理,则可用 register_callback() 安装按需执行深复制或解分配的处理函数。

调用示例

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

template >
class mystream : public std::basic_ostream
{
public:
    static const int xindex;
    mystream(std::basic_ostream& ostr) :
        std::basic_ostream(ostr.rdbuf())
    {
        this->pword(xindex) = this;
    }

    void myfn()
    {
        *this << "[special handling for mystream]";
    }
};

// 每个 mystream 特化从 xalloc() 获得独有的下标
template
const int mystream::xindex = std::ios_base::xalloc();

// 此 I/O 操纵符将能用于辨识身为 mystream 的 ostream
// 通过查找存储于 pword 的指针
template
std::basic_ostream& mymanip(std::basic_ostream& os)
{
    if (os.pword(mystream::xindex) == &os)
    {
        static_cast&>(os).myfn();
    }
    return os;
}

int main()
{
    std::cout << "cout, narrow-character test " << mymanip << '\n';

    mystream myout(std::cout);
    myout << "myout, narrow-character test " << mymanip << '\n';

    std::wcout << "wcout, wide-character test " << mymanip << '\n';

    mystream mywout(std::wcout);
    mywout << "mywout, wide-character test " << mymanip << '\n';
}

输出

c++11 标准模板(STL)(std::ios_base)(三)_第3张图片

 

你可能感兴趣的:(#,std::ios_base,c++,标准库模板,ios_base,本地环境,内部可扩展数组)