流类
流类的层次图:
一、ios类
类ios是所有类的祖先,其中包括三种重要的特性:格式化标志、错误状态位、文件操作模式。
1.格式化标志
格式标记位的取值为0或1:0表示关闭(不使用此格式),1表示开启(使用此格式)。如下:
boolalpha 如开启,则输入和输出使用bool值(即Ture或False)
showbase 如开启,则对于输出,使用C++ 基数前缀(0,0x)
showpoint 如开启,则显示末尾的小数点
uppercase 如开启,则对于16进制,使用大写字母;对于10进制,使用E表示法
showpos 如开启,则在正数前面加上+
dec 如开启,则使用基数10(进行输出)
oct 如开启,则使用基数8 (进行输出)
hex 如开启,则使用基数16 (进行输出)
fixed 如开启,则使用定点计数法
scientific 如开启,则使用科学计数法
left 如开启,则使用左对齐
right 如开启,则使用右对齐
internal 如开启,则符号或基数前缀左对齐,值右对齐
skipws 如开启,则跳过输入流中的空白字符
unitbuf 如开启,则每次输出操作后都会清空缓冲区
1)以上所有格式化标志,都可以使用类ios的成员函数setf()和unsetf()来设置。
如:
cout.setf(ios::left); //做对齐 cout<<"输出的左对齐"; cout.unsetf(ios::left); //恢复默认
2)另外大部分格式化标志都可以用操作符来设置。
操作符:直接插入流中的格式化命令。操作符包括两类:带有参数和不带参数。
①不带参数的操作符:
ws 输入时跳过空格
dec 转化为十进制
oct 转化为八进制
hex 转化为十六进制
endl 在输出流中插入换行符并刷新它
ends 插入空字符来终止输出字符串
flush 刷新输出流
lock 锁定文件句柄
unlock 解锁文件句柄
可以把上面这些操作符直接插入流中。如 cout<<hex<<var; //以十六进制输出var
②带有参数的操作符(概括了常用的,使用时需要包含头文件iomanip)
setw( ) 字段款(int) 输出时设置字段款
setfill( ) 填充字符(int) 输出时设置填充字符(默认空格)
setprecision( ) 精度(int) 设置精度(显示多少位数字,用于显示浮点数的精度)
setiosflags( ) 格式化标志(long) 设置指定标志
resetiosflags( ) 格式化标志(long) 清除指定标志
MSDN上的实例:
// iomanip_setw.cpp // compile with: /EHsc // Defines the entry point for the console application. // // Sample use of the following manipulators: // resetiosflags // setiosflags // setbase // setfill // setprecision // setw #include <iostream> #include <iomanip> using namespace std; const double d1 = 1.23456789; const double d2 = 12.3456789; const double d3 = 123.456789; const double d4 = 1234.56789; const double d5 = 12345.6789; const long l1 = 16; const long l2 = 256; const long l3 = 1024; const long l4 = 4096; const long l5 = 65536; int base = 10; void DisplayDefault( ) { cout << endl << "default display" << endl; cout << "d1 = " << d1 << endl; cout << "d2 = " << d2 << endl; cout << "d3 = " << d3 << endl; cout << "d4 = " << d4 << endl; cout << "d5 = " << d5 << endl; } void DisplayWidth( int n ) { cout << endl << "fixed width display set to " << n << ".\n"; cout << "d1 = " << setw(n) << d1 << endl; cout << "d2 = " << setw(n) << d2 << endl; cout << "d3 = " << setw(n) << d3 << endl; cout << "d4 = " << setw(n) << d4 << endl; cout << "d5 = " << setw(n) << d5 << endl; } void DisplayLongs( ) { cout << setbase(10); cout << endl << "setbase(" << base << ")" << endl; cout << setbase(base); cout << "l1 = " << l1 << endl; cout << "l2 = " << l2 << endl; cout << "l3 = " << l3 << endl; cout << "l4 = " << l4 << endl; cout << "l5 = " << l5 << endl; } int main( int argc, char* argv[] ) { DisplayDefault( ); cout << endl << "setprecision(" << 3 << ")" << setprecision(3); DisplayDefault( ); cout << endl << "setprecision(" << 12 << ")" << setprecision(12); DisplayDefault( ); cout << setiosflags(ios_base::scientific); cout << endl << "setiosflags(" << ios_base::scientific << ")"; DisplayDefault( ); cout << resetiosflags(ios_base::scientific); cout << endl << "resetiosflags(" << ios_base::scientific << ")"; DisplayDefault( ); cout << endl << "setfill('" << 'S' << "')" << setfill('S'); DisplayWidth(15); DisplayDefault( ); cout << endl << "setfill('" << ' ' << "')" << setfill(' '); DisplayWidth(15); DisplayDefault( ); cout << endl << "setprecision(" << 8 << ")" << setprecision(8); DisplayWidth(10); DisplayDefault( ); base = 16; DisplayLongs( ); base = 8; DisplayLongs( ); base = 10; DisplayLongs( ); return 0; }
③ ios 的成员函数(可以用来设置格式化标志和执行其他任务)
ch=fill( ) 返回填充字符(填充未使用字段,默认为空格)
fill( ch ) 设置填充字段
p=precision( ); 获得精度(显示浮点数小数点后的数字位数)
precision(p); 设置精度
w=width( ) 获得当前字段宽度(以字符计)
width( w ) 设置当前字段宽度
setf(flags) 设置指定的格式标志(例如:ios::left)
unself(flags) 清除指定的格式标志
setf(flags,fisld) 先清除字段,然后设置标志
函数setf()的两个参数的版本,使用第二个参数来重新设置特定的类型的所有标志,然后第一个参数中指定的标志被设置。
如:cout.setf(ios::left,ios::adjustfield) //清除处理字段对齐的所有标志,然后设置输出左对齐
第一个参数:设置的标志 | 第二个参数:清除的字段 |
dec、oct、hex left、right、internal scientific、fixed |
basefield adjustfield floatfield |
二、istream类---由类ios派生而来,执行指定的输入操作或者析取
磁盘文件、键盘---->程序:
intput、析取运算符(>>)、get( )、read( )
程序----->磁盘文件、屏幕:
output、插入运算符(<<)、put( )、write( )
类istream最经常使用的函数:
函数 | 用途 |
>> | 所有基本类型(和重载类型)的格式化输出 |
get(ch); | 析取一个字符到ch中 |
get(str); | 析取字符串到数组str中,直到遇到‘\n’ |
get(str,MAX) | 析取字符串到数组中,直到达到上限(MAX-1个元素) |
get(str,DELIM) | 析取字符串到str中,直到遇到分界符,分界符保留在流中 |
get(str,MAX,DELIM) | 析取字符串到数组str中,直到遇到分界符DELIM或者达到字符上限,分界符保留在流中 |
getline(str,MAX,DELIM) | 同上,析取分界符 |
putback(ch) | 插入读入的最后字符到输出流中 |
ignore(MAX,DELIM) | 析取并且丢弃最多MAX个字符,直到遇到指定的分界符 |
peek(ch) | 读取一个字符,把他保留在流中(特性像get一样) |
count=gcount( ) | 返回调用get,getline,或者read所读到的字符数 |
read(str,MAX) | 处理文件,析取最多MAX个字符到str,直到EOF |
seekg( ) | 设置从文件指定位置的指针偏移距离(字节数) |
pos=tellg(pos) | 返回从文件开始位置的指针偏移距离(字节数) |
三、ostream类---由类ios派生而来,处理输出或者插入行为
函数 | 用途 |
<< | 所有基本类型(和重载类型)的格式化插入 |
put(ch) | 插入字符ch到流中 |
flush( ) | 刷新换行符内容并且插入换行符 |
write(str,SIZE) | 把数组str中SIZE个字符插入到文件中 |
seekg( ) | 设置从文件指定位置的指针偏移距离(字节数) |
pos=tellg(pos) | 返回输出流中的指针偏移距离(字节数) |
四、类iostream和带_withassign的类
1. 类iostream由类istream和类ostream派生而来,只作为其他类的基类,没有自己的函数(除了构造函数和析构函数)。
2. 3中带_withassign的类:
类istream_withassign由类istream派生
类ostream_withassign由类ostream派生
类iostream_withassign由类iostream派生
这些带_withassign的类同派生他们的基类类似,除了带有用于复制对象的重载运算符之外。
3. 预定义流对象
cin是类istream_withassign的对象,通常用于键盘输入
cout是类ostream_withassign的对象,通常用于屏幕输出
cerr是类ostream_withassign的对象,用于显示错误信息
clog是类ostream_withassign的对象,用于显示日志信息
注意:传递给cerr的输出将立即显示,而不是先被缓冲(那是cout 的做法)