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

定义于头文件 <ios>

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::register_callback

void register_callback( event_callback function, int index );

注册将为 imbue() 、 std::basic_ios::copyfmt() 和 ~ios_base() 调用的用户定义函数。每次都调用每个注册的回调:事件类型( event 类型值)作为首参数传递,而且可用于区别调用方。

以注册的逆序调用回调(换言之, register_callback() 在回调栈上推入回调对)。若在回调函数内调用 register_callback() 添加新回调,则只在下次事件发生时调用新回调。

不允许用户定义的回调抛异常。

参数

function - 事件发生时将调用的函数,作为 event_callback 类型函数指针提供
index - 将传递给函数的自定义参数

返回值

(无)

注意

一旦注册,则不能解除注册回调:它在流对象剩下的生存期中保留为其一部分。若需要更改回调的行为,则可通过 iword() 或 pword() 控制。

若注册同一函数多次,则调用它多次。

与回调一同存储的整数值典型地为从 xalloc() 获得的下标。

设置C++和C的IO库是否可以互操作

std::ios_base::sync_with_stdio

static bool sync_with_stdio( bool sync = true );

设置标准 C++ 流是否与标准 C 流在每次输入/输出操作后同步。

标准 C++ 流为下列者: std::cin 、 std::cout 、 std::cerr 、 std::clog 、 std::wcin 、 std::wcout 、 std::wcerr 和 std::wclog 。

标准 C 流为下列者: stdin 、 stdout 和 stderr 。

对于与 C 流 f 同步的标准流 str ,下列函数对拥有等同的效果:

1) std::fputc(f, c) 和 str.rdbuf()->sputc(c)

2) std::fgetc(f) 和 str.rdbuf()->sbumpc()

3) std::ungetc(c, f) 和 str.rdbuf()->sputbackc(c)

实践中,这表示同步的 C++ 流为无缓冲,而每次 C++ 流上的 I/O 都立即应用到对应 C 流的缓冲区。这使得能自由地混合 C++ 与 C I/O 。

另外,同步的 C++ 流保证为线程安全(从多个线程输出的单独字符可能交错,但无数据竞争)。

若关闭同步,则允许 C++ 标准流独立地缓冲其 I/O ,可认为这在某些情况下更快。

所有八个标准 C++ 流默认与其相应的 C 流同步。

若在标准流上已出现 I/O 后调用此函数,则行为是实现定义的:有的实现无效果,有的实现销毁读取缓冲区。

参数

sync - 新的同步设置

返回值

调用函数前的同步状态

成员类

流异常

std::ios_base::failure

class failure;

std::ios_base::failure 定义输入/输出库中的函数在失败时抛出的异常对象。

std::ios_base::failure 可以定义为 std::ios_base 的成员类,或拥有等价功能的另一个类的同义词( typedef )。 (C++17 起)

成员函数

(构造函数)

构造异常对象
(公开成员函数)

std::ios_base::failure::failure

explicit failure( const std::string& message );

(C++11 前)

explicit failure( const std::string& message,
                  const std::error_code& ec = std::io_errc::stream );

(C++11 起)

explicit failure( const char* message,
                  const std::error_code& ec = std::io_errc::stream );

(C++11 起)

message 为解释性字符串构造异常对象,能在之后用 what() 取得。

参数

message - 解释性字符串

继承自 std::system_error

成员函数

code

返回错误码
(std::system_error 的公开成员函数)

what

[虚]

返回解释性字符串
(std::system_error 的虚公开成员函数)

继承自 std::runtime_error

继承自 std::exception

成员函数

(析构函数)

[虚]

析构该异常对象
(std::exception 的虚公开成员函数)

what

[虚]

返回解释性字符串
(std::exception 的虚公开成员函数)

初始化标准流对象

std::ios_base::Init

class Init;

此类用以确保默认 C++ 流( std::cin 、 std::cout 等)被正确初始化及析构。此类跟踪它被创建的实例数量,在构造首个实例时创建并初始化 C++ 流,并且在析构最后实例时冲入输出流。

头文件 <iostream> 表现如同它定义(直接或间接)一个有静态存储期的 std::ios_base::Init 实例:这使得在拥有有序初始化的静态对象的构造函数及析构函数中,访问标准 I/O 流是安全的(只要在翻译单元中,定义该对象前包含 #include <iostream> )。

成员函数

(构造函数)

若 *this 是首次创建的实例,则初始化默认 C++ 流
(公开成员函数)

(析构函数)

若 *this 是被最后销毁的实例,则冲入默认 C++ 流
(公开成员函数)

猜你喜欢

转载自blog.csdn.net/qq_40788199/article/details/131145833
今日推荐