促进 C++库

……其中一个世界。 赫伯·萨特安德烈亚历山德雷斯库,C++编码标准

这是旧版本boost的文档。单击此处查看最新的Boost文档。

标题<boost/io/ios状态.hpp>

标题boost/io/ios状态.hpp介绍如何保存C++IOStreams中对象的流状态系统。

目录

  1. 目录
  2. 理论基础
  3. 标题简介
  4. 基本标准属性的保存程序
  5. 高级标准属性的保存程序
  6. 用户定义属性的保存程序
  7. 组合属性的保存程序
  8. 例子
  9. 工具书类
  10. 信用

理论基础

有时,某个值只能在有限的范围内更改。保存程序类保存某个对象(或并在销毁时重置对象的状态,撤消对象可能经历的任何更改。

当使用I/O流对象时,saver类策略很有帮助。操纵器对象可以在输入或输出。操纵器更改的状态通常会保持为新状态值。如果操纵器用于不应外部更改流的状态。

#包括<ostream>#包括<ios>void hex_mybyte(标准::ostream&os,字符字节){os<<std::hex<<static_cast<unsigned>(字节);}

这个操作系统流将保留其新的十六进制打印调用后的模式十六进制字节.流的打印可以通过手动调用流的状态来保存和恢复模式检查和更改成员函数。手动方法变成如果主要功能复杂和/或需要异常安全。saver类可以实现更好的“资源“收购即初始化”战略。

请参阅例子下面的代码,使用保存程序类。

标题简介

#包括<iosfwd>//对于std::char_traits(声明)命名空间增强{命名空间io{类ios_flags_saver;类ios_precision_saver;类ios_width_saver;类ios_base_all_saver;模板<typename Ch,class Tr=::std::char_traits<Ch>>类basic_ios_iostate_saver;模板<typename Ch,类Tr=::std::char_traits<Ch>>类basic_ios_exception_saver;模板<typename Ch,class Tr=::std::char_traits<Ch>>类basic_ios_tie_saver;模板<typename Ch,类Tr=::std::char_traits<Ch>>类basic_ios_rdbuf_saver;模板<typename Ch,class Tr=::std::char_traits<Ch>>类basic_ios_fill_saver;模板<typename Ch,class Tr=::std::char_traits<Ch>>类basic_ios_locale_saver;模板<typename Ch,class Tr=::std::char_traits<Ch>>类basic_ios_all_saver;typedef basic_ios_iostate_saver<char>ios_isotate_saver;typedef basic_ios_iostate_saver<wchar_t>wios_iostatesaver;类型定义basic_ios_exception_saver;类型定义basic_ios_exception_saver;类型定义basic_ios_tie_saver<char>ios_tie _saver;类型定义basic_ios_tie_saver;类型定义basic_ios_rdbuf_saver;类型定义basic_ios_rdbuf_saver<wchar_t>wios_rdbuf _saver;typedef basic_ios_fill_saver<char>ios_file_saver;typedef basic_ios_fill_saver<wchar_t>wios_fill-saver;类型定义basic_ios_locale_saver;类型定义basic_ios_locale_saver;类型定义basic_ios_all_saver;类型定义basic_ios_all_saver;类ios_word_saver;类ios_pword_saver;类ios_all_word_saver;}}

基本标准属性的保存程序

基本的saver类具有以下格式:

saver_class(存储类){typedef标准::ios_base状态类型;类型定义实现定义方面类型;显式saver_class(状态类型);saver_class(状态类型,方面类型常量&新值);~saver_class();void restore();};

这个状态_类型是IOStreams基类标准::ios_base。用户通常会将state-type参数的输入、输出或组合流对象,而不是基类对象。第一个构造函数接受流对象并保存对流的引用和特定的流属性。第二个构造函数的工作方式类似于首先,并使用其第二个参数将流的属性更改为新的方面类型给定的值。析构函数恢复保存值的流属性。可以激活恢复早期(经常)使用恢复成员函数。

基本IOStreams状态保存程序类
类别 保存的属性 属性类型 读取方法 写作方法
boost::io::ios_flags_saver 格式控制标志 标准::ios_base::fmtflags 旗帜 旗帜
增强::io::ios_precision_saver 小数点后要打印的位数 标准::流大小 精度 精度
增强::io::ios_width_saver 打印对象的最小字段宽度 标准::流大小 宽度 宽度

高级标准属性的保存程序

saver类模板的格式如下:

模板<typename Ch,class Tr>saver_class(存储类){typedef标准::basic_ios<Ch,Tr>state_type;类型定义实施_定义aspect_type(方面类型);显式saver_class(状态类型);saver_class(状态类型,方面类型常量和新值);~saver_class();void restore();};

这个状态_类型是IOStreams基类的一个版本模板标准::basic_ios<Ch,Tr>,其中中国是字符类型,并且Tr公司是一个字符traits类。用户通常会放置实际的输入、输出或state-type参数的组合流对象,而不是基类对象。第一个构造函数获取流对象并保存引用流和特定流的当前值属性。第二个构造函数的工作方式与第一个构造函数类似,并使用其将流的属性更改为新属性的第二个参数方面类型给定的值。析构函数恢复流的属性设置为保存的值。可以激活恢复早期(经常)使用恢复成员函数。

高级IOStreams状态保存程序类模板
类模板 保存的属性 属性类型 读取方法 写作方法
boost::io::basic_ios_iostate_saver<Ch,Tr> 流的故障状态[1],[2] 标准::ios_base::iostate rd状态 清楚的
boost::io::basic_ios_exception_saver<Ch,Tr> 哪些故障状态触发异常[1] 标准::ios_base::iostate 例外 例外
升压::io::basic_ios_tie_saver<Ch,Tr> 与流同步的输出流 标准::basic_ostream<Ch,Tr>* 领带 领带
boost::io::basic_ios_rdbuf_saver<Ch,Tr> 与流关联的流缓冲区[2] 标准::basic_streambuf<Ch,Tr>* rdbuf公司 rdbuf公司
boost::io::basic_ios_fill_saver<Ch,Tr> 用于填充过大字段宽度的字符 中国 填满 填满
boost::io::basic_ios_locale_saver<Ch,Tr> 与流关联的区域设置信息[3] 标准::语言环境 获取位置(来自标准::ios_base) 灌水(来自标准::basic_ios<Ch,Tr>)

笔记

  1. 当故障状态标志和/或故障状态异常监视标志发生更改,如果匹配,则引发异常出现在两组标志之间。这可能意味着这个这些类的构造函数或析构函数模板可能引发.
  2. 当相关的流缓冲区发生更改时,流的如果给定流,则故障状态集重置为“良好”缓冲区的地址为非NULL,但“错误”故障如果该地址为NULL,则设置状态。这意味着已保存“良好”的故障状态可能会恢复为“不良”如果流被剥离出关联的流缓冲区。更糟糕的是,给定NULL流缓冲区地址,如果正在监视“坏”故障状态。这可能意味着那个这些类的构造函数或析构函数模板可能引发.
  3. 这个区域设置的保护程序使用标准::basic_ios<Ch,Tr>类以提取其信息,尽管它可以使用该功能在里面标准::ios_base问题是版本中所需的成员函数ios基础不是基本_操作系统. 将与saver类一起使用的流类应使用与其最接近的成员函数的版本通过继承,也就是说基本_操作系统.

用户定义属性的保存程序

用户定义格式信息的保存程序类具有以下特性格式:

#包括<iosfwd>//对于std::ios_base(声明)saver_class(存储类){typedef标准::ios_base状态类型;typedef int索引类型;类型定义实现定义方面类型;显式saver_class(状态类型&s,索引类型i);saver_class(状态类型&s,索引类型i,方面类型常量和新值);~saver_class();void restore();};

索引区分特定的用户定义格式化属性。索引只能在运行时确定(很可能使用class-static标准::ios_base::xalloc成员函数)。

这个状态_类型是IOStreams系统的基类,标准::ios_base。用户通常会放置一个实际的状态类型参数的输入、输出或组合流对象,而不是基类对象。第一个构造函数接受流对象和索引,并保存对流和当前特定流属性的值。第二名施工员工作与第一个类似,并使用其第三个参数更改流的属性为新方面类型给定的值。析构函数将流的属性恢复为保存的值。恢复可以使用恢复成员功能。

IOStream用户定义的状态保存程序类
类别 保存的属性 属性类型 参考方法
增强::io::ios_word_saver 用户定义的数字格式标志 长的 依福德
增强::io::ios_pword_saver 指针用户定义的格式标志 空隙* 密码

组合属性的保存程序

组合属性保存程序有三个类(模板)。这个增强:io::ios_base_all_saversaver类将所有基本属性保护程序类的功能。它有一个构造函数,使流保持其状态。这个增强::io::basic_ios_all_saver结合了功能所有高级属性保护程序类模板和基本属性saver类。它有一个接受流的构造函数保持其状态。这个增强::io::ios_all_word_saversaver类将保存用户定义的格式信息的保护程序类。构造函数获取流以保存其属性和索引用户定义的属性。每个类的析构函数恢复保存的状态。对于使用恢复成员函数。

例子

中使用的代码理论基础可以是在两个地方有所改善。打印功能可以使用周围的保护程序更改格式状态的代码。或者调用函数可以用一个储存器包围通话。或者两者都可以做到,特别是如果用户不知道打印功能是否使用了状态保护程序。如果用户希望前后进行一系列更改,而不是围绕每个更改在单独的块中进行更改恢复成员函数可以在每次试验之间调用。

#包括<boost/io/ios_state.hpp>#包括<ios>#包括<iostream>#包括<ostream>void new_hex_mybyte(标准::ostream&os,字符字节){boost::io::ios_flags_saver ifs(os);os<<std::hex<<static_cast<unsigned>(字节);}整型main(){使用std::cout;使用std::cerr;//...{增强::io::iosall_saver ias(cout);new_hex_my_byte(cout,'A');}//...{增强::io::iosall_saver ias(cerr);new_hex_my_byte(cerr,'b');ias.restore();new_hex_my_byte(cerr,'C');}//...}

工具书类

信用

贡献者

达里尔·沃克
已启动库。贡献了的初始版本格式标志、精度、宽度和用户定义的格式标志保存程序类。贡献了成功的最初版本状态,成功状态异常标志,输出流绑定,流缓冲区、字符填充和区域设置保护程序类模板。贡献了组合属性类和类模板。贡献了测试文件ios状态测试.cpp.

历史

2005年2月28日,Daryle Walker
添加了恢复成员职能,基于建议作者:Gennadiy Rozental和Rob Stewart
2002年3月13日,Daryle Walker
初始版本

修订日期:2005年2月28日

版权所有20022005 Daryle Walker。使用、修改和分发受Boost软件许可证1.0版的约束。(见随附文件文件许可证_1_0.txt或一份副本<http://www.boost.org/LICENSE_1_0.txt>.)