定义于头文件 <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, | (C++11 起) | |
explicit failure( const char* message, | (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++ 流 (公开成员函数) |