C++之输入输出流
输入输出流:
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 }