1.用途
有时候需要局部地方改变一个流状态变量,时后又需要恢复。
#include <iostream>
#include <boost/io/ios_state.hpp>
using namespace std;
void byte_to_hex(ostream &os, char byte)
{
boost::io::ios_flags_saver ifs(os);
os << hex << static_cast<unsigned>(byte) << endl;
}
int main()
{
char c = 100;
byte_to_hex(cout, c);
cout << 200 << endl;//假如没有boost::io::ios_flags_saver ifs(os);这里输出c8
return 0;
}
2.框架
#include <iosfwd> // for std::char_traits (declaration)
namespace boost
{
namespace io
{
class ios_flags_saver;
class ios_precision_saver;
class ios_width_saver;
class ios_base_all_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_iostate_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_exception_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_tie_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_rdbuf_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_fill_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_locale_saver;
template < typename Ch, class Tr = ::std::char_traits<Ch> >
class basic_ios_all_saver;
typedef basic_ios_iostate_saver<char> ios_iostate_saver;
typedef basic_ios_iostate_saver<wchar_t> wios_iostate_saver;
typedef basic_ios_exception_saver<char> ios_exception_saver;
typedef basic_ios_exception_saver<wchar_t> wios_exception_saver;
typedef basic_ios_tie_saver<char> ios_tie_saver;
typedef basic_ios_tie_saver<wchar_t> wios_tie_saver;
typedef basic_ios_rdbuf_saver<char> ios_rdbuf_saver;
typedef basic_ios_rdbuf_saver<wchar_t> wios_rdbuf_saver;
typedef basic_ios_fill_saver<char> ios_fill_saver;
typedef basic_ios_fill_saver<wchar_t> wios_fill_saver;
typedef basic_ios_locale_saver<char> ios_locale_saver;
typedef basic_ios_locale_saver<wchar_t> wios_locale_saver;
typedef basic_ios_all_saver<char> ios_all_saver;
typedef basic_ios_all_saver<wchar_t> wios_all_saver;
class ios_iword_saver;
class ios_pword_saver;
class ios_all_word_saver;
}
}
3.例子
#include <iostream>
#include <fstream>
#include <boost/io/ios_state.hpp>
using namespace std;
void logging(char* msg)
{
cout << msg << endl;
}
int main()
{
std::string s("logfile.txt");
cout << "log start" << endl;
if (!s.empty()) {
//boost::io::ios_all_saver ifs(cout);//假设在这里,运行时候就会出错。
ofstream ofs(s.c_str());
boost::io::ios_all_saver ifs(cout);
cout.rdbuf(ofs.rdbuf());
cout << "fatal msg" << endl;
}
cout << "log finish" << endl;
return 0;
}
仅是简单的用法说明,具体的还请参照BOOST文档。