输入输出流:
1. I/O(输入/输出)流类库提供对象之间的数据交互服务
流类库预定义了一批流对象,连接常用的外部设备
程序员可以定义所需的I/O流对象,使用流库提供的工作方式
实现数据传输
2.流类和流对象: 程序中,对数据的输入/输出是以字节流实现的
应用程序对字节序列作出各种数据解释
I/O系统的任务就是在内存和外部设备之间稳定可靠地传输数据
和解释数据。
流类对象可以建立和删除,可以从流中获取数据和向流添加数据
3.流类库: 流库(stream library)是用继承方法建立的输入输出类库
流库具有两个平行的基类:streambuf 和 ios 类,所有流类均以两者
之一作为基类
streambuf 类提供对缓冲区的低级操作
设置缓冲区 对缓冲区指针操作 向缓冲区存/取字符
ios 类及其派生类提供用户使用流类的接口,支持对streambuf 的缓
冲区输入/输出的格式化或非格式化转换
4.提供用户接口:
5.头文件
含有cin、cout、cerr、clog对象,提供无格式和格式化的I/O
(1) cin istream 类的对象,通常连向键盘,可以重定向
(2) cout ostream 类的对象,通常连向显示器,可以重定向
(3) cerr ostream 类的对象,连向显示器。不能重定向
(4) clog ostream 类的对象,连向打印机。不能重定向
7.istream的共有成员函数
函数 | 功能 |
read | 无格式输入指定字节数 |
get | 从流中提取字符,包括空格 |
getline | 从流中提取一行字符 |
ignore | 提取并丢弃流中指定字符 |
peek | 返回流中下一个字符,但不从流中删除 |
gcount | 统计最后输入的字符个数 |
eatwhite | 忽略前导空格 |
seekg | 移动输入流指针 |
tellg | 返回输入流中指定位置的指针值 |
operstor>> | 提取运算符 |
1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 char c; 7 cout << "输入字符:\n"; 8 while((c=cin.get())!='\0') 9 { 10 cout.put(c); 11 } 12 cout << endl; 13 cout << "再次输入字符:\n"; 14 while(cin.get(c)) 15 { 16 if(c == '\0') 17 { 18 break; 19 } 20 cout.put(c); 21 } 22 cout << endl; 23 char s[80]; 24 cout << "最后输入字符:\n"; 25 //指定输出字符数 26 cin.get(s,10); 27 cout << s << endl; 28 }
5.ostream的共有成员函数
函数 | 功能 |
put | 无格式,插入一个字节 |
write | 从无格式,插入一字节序列 |
flush | 刷新输出流 |
seekp | 移动输出流指针 |
tellp | 返回输出流中指定位置的指针值 |
operstor<< | 插入运算符 |
1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 char c[26]; 7 cin.getline(c,26); 8 cout.write(c,26); 9 cout << endl; 10 }
6.格式控制
状态标志 值 含义 输入/输出
skipws 0X0001 跳过输入中的空白 I
left 0X0002 左对齐输出 O
right 0X0004 右对齐输出 O
internal 0X0008 在符号位和基指示符后填入字符 O
dec 0X0010 转换基制为十进制 I/O
oct 0X0020 转换基制为八进制 I/O
hex 0X0040 转换基制为十六进制 I/O
showbase 0X0080 在输出中显示基指示符 O
showpoint 0X0100 输出时显示小数点 O
uppercase 0X0200 十六进制输出时一律用大写字母 O
showpos 0X0400 正整数前加“+”号 O
scientific 0X0800 科学示数法显示浮点数 O
fixed 0X1000 定点形式显示浮点数 O
unitbuf 0X2000 输出操作后立即刷新流 O
stdio 0X4000 输出操作后刷新stdout 和 stdree O
7.IOS控制格式的函数:
函数 | 功能 |
long flags( long lFlags ); long flags() const; | 用参数lFlags更新标志字 返回标志字 |
long setf( long lFlags ); long setf( long lFlags, long lMask ); | 设置lFlags指定的标志位 将lMask指定的位清0,然后设置lFlags指定位 |
long unsetf( long lMask ); | 将参数lMask指定的标志位清0 |
int width( int nw ); | 设置下一个输出项的显示宽度为nw |
char fill( char cFill ); | 空白位置以字符参数cFill填充 |
int precision( int np ); | 用参数np设置数据显示精度 |
8.设置输出宽度
1 #include<iostream> 2 using namespace std; 3 //设置输出宽度 4 int main() 5 { char *s = "Hello"; 6 cout.fill( '*' ) ; //设置填充符 7 cout.width( 10 ) ; //设置输出宽度 8 cout.setf( ios :: left ) ; //设置左对齐 9 cout << s << endl ; 10 cout.width( 15 ) ; //设置输出宽度 11 cout.setf( ios :: right, ios :: left ) ; //消除左对齐标志位,设置右对齐 12 cout << s << endl ; 13 }
8.不用基数形式的输出和输入
1 #include<iostream> 2 using namespace std; 3 int main() 4 { int a , b , c ; 5 cout << "please input a in decimal: " ; 6 cin >> dec >> a ; 7 //cin.setf( ios :: dec , ios :: basefield ) ; 8 //cin >> a ; //十进制输入 9 10 cout << "please input b in hexadecimal: " ; 11 cin >> hex >> b ; 12 //cin.setf( ios :: hex , ios :: basefield ) ; 13 //cin >> b ; //十六进制输入 14 15 cout << "please input c in octal: " ; 16 cin >> oct >> c ; 17 //cin.setf( ios :: oct , ios :: basefield ) ; 18 //cin >> c ; //八进制输入 19 20 cout << "Output in decimal :\n" ; 21 cout <<"a = "<<a<<" b = "<<b<<" c = "<<c<<endl ; 22 //cout.setf( ios :: dec, ios :: basefield ); //十进制输出 23 //cout << "a = " << a << " b = " << b << " c = " << c << endl ; 24 25 cout <<hex<<"a = "<<a<<" b = "<<b<<" c = "<<c<<endl ; 26 //cout.setf( ios :: hex , ios :: basefield ) ; //十六进制输出 27 cout << "Output in hexadecimal :\n" ; 28 cout << "a = " << a << " b = " << b << " c = " << c << endl ; 29 30 cout <<oct<<"a = "<<a<<" b = "<<b<<" c = "<<c<<endl ; 31 32 //cout.setf( ios :: oct , ios :: basefield ) ; //八进制输出 33 //cout << "Output in octal :\n" ; 34 cout << "a = " << a << " b = " << b << " c = " << c << endl ; 35 }
9,格式化输出浮点数
1 #include<iostream> 2 using namespace std; 3 int main() 4 { double x = 22.0/7 ; 5 int i ; 6 cout << "output in fixed :\n" ; 7 cout.setf( ios::fixed | ios::showpos ) ; // 定点输出,显示 + 8 for( i=1; i<=5; i++ ) 9 { cout.precision( i ) ; cout << x << endl ; } 10 cout << "output in scientific :\n" ; 11 // 清除原有设置,科学示数法输出 12 cout.setf(ios::scientific, ios::fixed|ios::showpos ) ; 13 for( i=1; i<=5; i++ ) 14 { cout.precision(i) ; cout << x*1e5 << endl ; } 15 }
10.格式控制符
控制符 | 功能 | 输入/输出 |
endl | 输出一个新行符,并清空流 | O |
ends | 输出串结束符,并清空流 | O |
flush | 清空流缓冲区 | O |
dec | 用十进制表示法输入或输出数值 | I/O |
hex | 用十六进制表示法输入或输出数值 | I/O |
oct | 用八进制表示法输入或输出数值 | I/O |
ws | 提取空白字符 | I |
11.iomanip的控制符
控制符 | 功能 | 输入/输出 |
resetiosflags ( ios::lFlags ) | 清除lFlags指定的标志位 | I/O |
setiosflags ( ios::lFlags ) | 设置lFlags指定的标志位 | I/O |
setbase ( int base ) | 设置基数,base = 8,10,16 | I/O |
setfill ( char c ) | 设置填充符c | O |
setprecision ( int n ) | 设置浮点数输出精度 | O |
setw ( int n ) | 设置输出宽度 | O |
1 // 例11-7 整数的格式化输出 2 #include <iostream> 3 #include <iomanip> 4 using namespace std ; 5 int main() 6 { const int k = 618 ; 7 cout << setw(10) << setfill('#') << setiosflags(ios::right) << k <<endl ; 8 cout << setw(10) << setbase(8) << setfill('*') 9 << resetiosflags(ios::right) << setiosflags(ios::left) << k << endl ; 10 }