std::ios_base做为所有stream最底层的类,主要提供 “与字符类型以及其相应之char_traits无关”的:
(1), state information
(2), control information
(3), private storage
(4), callbacks
构造函数:
public:
ios_base( const ios_base& ) = delete;
protected:
ios_base();
其中拷贝构造函数是被删除了的(=delete)
默认构造函数则是protected的这意味着我们只能在它的派生类中使用。
std::ios_base::flags
fmtflags flags() const;
fmtflags flags( fmtflags flags );
不接受参数的flags()返回当前stream返回当前设置的flag(s).
接受参数的flags()给当前流设置flag(s),并返回设置之前的flag(s).
std::ios_base::setf
fmtflags setf( fmtflags flags );
fmtflags setf( fmtflags flags, fmtflags mask );
1,给当前stream增加额外的flag(s),返回设置之前的flag(s).
2,首先清除当前stream设置的mask, 然后设置flags到清除的位置.
fl = (fl & ~mask) | (flags & mask) ;//fl为std::ios_base private data member.
std::ios_base::unsetf
void unsetf( fmtflags flags );
从当前流清除掉指定的flags.
std::ios_base::width
streamsize width() const;
streamsize width( streamsize new_width );
不接受参数的版本返回当前输出栏的宽度
接受参数的版本设置输出栏的宽度为new_width,并返回之前的输出栏的宽度.
std::ios_base::precision
streamsize precision() const;
streamsize precision( streamsize new_precision );
返回流内输出浮点数时所用的精度
设置流内输出浮点数时的精度,并返回设置前的精度.
std::ios_base::imbue
std::locale imbue( const std::locale& loc );
给当前stream设置std::locale.
std::ios_base::getloc
std::locale getloc() const;
获得当前stream设置的std::locale.
std::ios_base::sync_width_stdio
static bool sync_with_stdio( bool sync = true );
默认情况下: std::cin, std::cout, std::cerr, std::clog以及他们对应的w_char版本是与标准C Stream同步的.
该函数其实可以拉出来作为一个专门的课题研究一下:
调用该函数的时候必须位于所有I/O操作之前.
由于C++兼容C,但是在C中也有I/O stream(stdin, stdout, stderr)而这些stream都有buffer的概念怎么办呢?
于是C++中就有了这个函数默认情况下(true)每次C++的I/O操作除了在自己的buffer内缓存一份外还要缓存一份到C stream的buffer内.因此常常该特性也会拖慢C++ stream的性能.
另外2点:
1,调用sync_with_stdio(true)的情况下是线程线程安全的保证不会产生data race.且保证了C/C++的I/O stream可以混用.
2,调用sync_with_stdio(false)的情况不会再缓存数据到C stream的buffer中,一般情况下都会有提速.最好不要C/C++的I/O stream混用了.
操纵符与flags(注意flags的类型为std::ios::fmtflgas):
std::boolalpha 将true和false显示为字符串(其实具体的显示还是要看当前设置的std::locale, 相当于设置了std::ios::boolalpah)
std::noboolalpha 将要true和false输出为1和0(相当于设置了~std::ios::boolalpha)
std::showbase 对整型值输出显示进制前缀(相当于设置了std::ios::showbase)
std::noshowbase 取消对整型值输出显示进制前缀(相当于设置了~std::ios::showbase)
std::showpoint 对浮点数(float, double)总是显示小数点(相当于设置了std::ios::showpoint)
std::noshowpoint 当浮点数包含小数部分的时候才显示小数点(相当于设置了~std::ios::showpoint)
std::showpos 对非负数显示+(相当于设置了std::ios::showpos)
std::noshowpos 对非负数不显示+ (相当于设置了~std::ios::showpos)
std::uppercase 在十六进制值中打印0X,在科学记数法中打印E (相当于设置了std::ios::uppercase)
std::nouppercase 在十六进制值中打印0x,在科学计数法中打印e (相当于设置了std::ios::nouppercase)
std::dec 整型值显示为十进制 (相当于设置了std::ios::dec)
std::hex 整型值显示为十六进制 (相当于设置了std::ios::hex)
std::oct 整型值显示为八进制 (相当于设置了std::ios::oct)
std::left 在值的右侧添加填充字符 (相当于设置了std::ios::left)
std::right 在值的左侧添加填充字符 (相当于设置了std::ios::right)
std::internal 正负号靠左对齐,数值靠右对齐(相当于设置了std::ios::internal)
std::fixed 浮点数显示为定点十进制(相当于设置了std::ios::fixed)
std::scientific 浮点值显示为科学计数法(相当于设置了std::ios::scientific)
std::hexfloat 浮点值显示为十六位进制 (相当于设置了std::ios::hexfloat)
std::defaultfloat 重置浮点数格式为十进制(相当于设置了std::ios::defaultfloat)
std::unitbuf 每次输出操作都刷新缓冲区(相当于设置了std::ios::unitbuf)
std::nounitbuf 恢复正常的缓冲区刷新模式 (相当于设置了~std::ios::unitbuf)
std::skipws 输入运算符(operator >>)跳过空白符(相当于设置了std::ios::skipws)
std::noskipws 输入运算符(operator>>)不跳过空白符 (相当于设置了~std::ios::skipws)
std::flush 刷新输出流的缓冲区
std::ends 在输出流中插入'\o',并刷新缓冲区
std::endl 在输出流中插入'\n',并刷新缓冲区
std::setw(val) 令val为当前I/O栏的宽度.
std::setfill(c) 将c定义为填充字符.
std::setprecision(int) 设置小数精度.
std::setbase(int) 设置以哪种进制来输出流中的数字.
std::setiosflags(flags) 给指定stream设置flags其实是间接调用流的setf(flags)成员函数.
std::resetiosflags(mask) 清除指定stream所标示的一组flag其实间接调用该stream的setf(0, mask).