輸入輸出流:
1. I/O(輸入/輸出)流類庫提供對象之間的數據交互服務
流類庫預約義了一批流對象,鏈接經常使用的外部設備
程序員能夠定義所需的I/O流對象,使用流庫提供的工做方式
實現數據傳輸
2.流類和流對象: 程序中,對數據的輸入/輸出是以字節流實現的
應用程序對字節序列做出各類數據解釋
I/O系統的任務就是在內存和外部設備之間穩定可靠地傳輸數據
和解釋數據。
流類對象能夠創建和刪除,能夠從流中獲取數據和向流添加數據
3.流類庫: 流庫(stream library)是用繼承方法創建的輸入輸出類庫
流庫具備兩個平行的基類:streambuf 和 ios 類,全部流類均以二者
之一做爲基類
streambuf 類提供對緩衝區的低級操做
設置緩衝區 對緩衝區指針操做 向緩衝區存/取字符
ios 類及其派生類提供用戶使用流類的接口,支持對streambuf 的緩
衝區輸入/輸出的格式化或非格式化轉換ios
4.提供用戶接口:程序員
5.頭文件函數
含有cin、cout、cerr、clog對象,提供無格式和格式化的I/Ospa
(1) cin istream 類的對象,一般連向鍵盤,能夠重定向指針
(2) cout ostream 類的對象,一般連向顯示器,能夠重定向code
(3) cerr ostream 類的對象,連向顯示器。不能重定向對象
(4) clog ostream 類的對象,連向打印機。不能重定向blog
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 }