1 概述
C和C++都沒有將輸入和輸出建立在語言中,C++將輸入輸出的解決方案放在類庫中(由頭文件iostream和fstream中定義的類)
C++程序把輸入和輸出看作字節流。流充當了程序和流源流目標之間的橋梁。
C++輸入輸出類的派生關系:ios_base -> ios -> istream/ostream -> iostream
cin和cout是對象
2 cout
2.1 <<插入操作符
使用插入操作符可以有一下3種方法:1.一個cout接受的類型(int char long(包括signed/unsigned)float double long double),包括數值/變量/解除引用的指針/數組;2.char數組名或char的指針(必須是char */signed char */unsigned char*而不能是其他類型)3.引號引起的字符串
1 int i = 999; 2 int *p = &i; 3 cout<<*p<<" "<<p<<endl; 4 char *a = "hellow"; 5 cout<<*a<<" "<<a<<endl; 6 char name[10] = "world"; 7 cout<<name<<endl;
輸出結果:
也就是說對於非char類型的指針,必須是cout<<*p,否則cout<<p只是輸出p的地址;而char類型的指針,cout<<*p相當於輸出p[0],是cout<<p輸出p指向字符串的全部內容,原因是cout<<原型中為char類型提供了單獨的char指針類型,charl類型的字符串數組也是類似。總而言之對非char類型的指針或數組名正常處理,對於char類型的指針或數組名直接當作內容處理
2.2 拼接輸出
<<插入操作符可以拼接,方法也可以拼接,如cout.pur('I').put('T')
2.3 cout.put();cout.write()
put輸出字符,接收一個char類型的參數,或者將數值參數轉化為char值
write輸出字符串,接收兩個參數,原型為:
1 basic_ostream<charT,traints>& write(const char_type* s, streamsize n);
write遇到空字符時不會停止,即使超出邊界,write仍繼續打印
cout.put('A')<<endl; cout.put('A' + 0x20)<<endl; cout.put(65)<<endl; char *name = "hellow"; char *name1 = "world"; cout.write(name,12)<<endl;
2.4 cout格式化值
對於char,數值整型,字符串顯示在與其寬度相對應的字段中,對於浮點數,顯示為6位(如果夠6位),不夠的末尾的0也不顯示,當指數>=6或<=-5時以科學計數法顯示,否則以定點表示法顯示
1 float i = 1.2; 2 float j = 1.23456789; 3 float m = 123456789; //默認精讀是6位 4 float n = 123456.789; 5 cout<<i<<endl; 6 cout<<j<<endl; 7 cout<<m<<endl; 8 cout<<n<<endl; 9 cout<<(n * 1e3)<<endl;
最后一行相當於1乘以10的3次方,此時指數大於6,用科學計數法表示
輸出十進制:cout<<dec;八進制:cout<<oct;十六進制:cout<<hex 作用域,永久有效直到將格式狀態改變為止。
2.5 cout.width();cout.fill();cout.precision()
width()方法有兩種原型:
int width(); //返回字符寬度的當前設置
int width(int i); //設置寬度為i,並返回以前的字符寬度
注意:width方法只影響接下來顯示的一個項目,然后將字段寬度恢復為默認值;C++永遠不會截短數據,當寬度不夠會增加寬度,顯示所有數據比保持列整潔更為重要
1 int w = cout.width(30); 2 cout << "default field width = " << w << ":\n"; 3 for(int i = 1;i <= 10;i++) 4 { 5 cout<<"width:"; 6 cout.width(i); 7 cout<<i<<endl; 8 }
由於width()返回以前的寬度,故返回默認的寬度為0,程序表明width()只影響接下來被顯示的一個項目
默認情況下用空格填充字段中未被使用的部分,可以用fill()方法來修改填充,比如用*填充寫作cout.fill('*'),其作用域一直持續直到更改為止
cout.precision()為設置精度的方法,在默認情況下精度是指的總位數,在定點模式(fixed)和科學模式下精度是指小數點后面的位數,作用域也是一直有效,默認情況下精度是6位
1 cout.precision(5); 2 float i = 1.2345678; 3 cout<<i<<endl; 4 cout<<fixed<<i<<endl;
2.6 cout.setf();cout.setf()以及C++的標准控制符
這類函數可以控制多種格式化特性,前者是用來設置格式,后者用來消除格式,比如:cout.setf(hios_base::showpoint),用來顯示末尾小數點,但是這樣用比較繁瑣,所以C++提供了多個控制符,能夠調用setf()
標准控制符直接在插入操作符后面使用,一些常見的標准控制符:
cout<<showbase; cout<<noshowbase; 對於輸出使用/不使用C++前綴
cout<<showpoint; cout<<noshowpoint; 顯示/不顯示末尾小數點
cout<<showpos; cout<<unshowpos; 對於正數,顯示/不顯示 +
cout<<left; cout<<right; 左對齊/右對齊
cout<<dec; cout<<oct; cout<<hex; 輸出十進制/八進制/十六進制
cout<<fixed; cout<<scientific; 使用定點/科學計數法
2.7 iomanip頭文件
主要提供三個函數:setprecision(); 設置精度
setfill(); 填充字符
setw(); 設置寬度
比較方便的是可以與cout語句拼接起來
3 cin
3.1 >>抽取操作符
cin>>______ 空格必須是cin接受的類型(int char long(包括signed/unsigned)float double long double),可以是變量,引用,被解除引用的指針,也可以是類或結構體成員
同cout一樣也單獨針對char類型的指針和數組做出單獨的重載,可以直接使用數組名或指針,而對於非char類型的指針則必須要解除引用
1 int a; 2 int *p = &a; 3 cin>>*p; 4 cout<<*p<<endl; 5 char name[10]; 6 cin>>name; 7 cout<<name<<endl;
3.2 cin>>檢查輸入
讀取從非空白字符開始,到與目標類型不匹配的第一個字符之間的全部內容。輸入與預期格式不匹配將導致cin>>結果為false
輸入結束條件 :到與目標類型不匹配的第一個字符(比如Enter、Space、Tab鍵)
對結束符的處理 :丟棄緩沖區中使得輸入結束的結束符(Enter、Space、Tab)
3.3 cin.get(); cin.getline();
cin.get(); cin.getline() 都提供不跳過空白的輸入
cin.get()常用的有三種原型:cin.get(), cin.get(char ), cin.get(char *, int)
單字符輸入可以用前兩種,ch=cin.get() 與 cin.get(ch)是等價的,輸入並顯示一段帶空格的字符串
1 char ch; 2 while( (ch = cin.get()) != '\n') 3 cout<<ch;
字符串出入可以用cin.get(char *, int)或是cin.getline(char *, int)
輸入結束條件 :讀取到指定數目字符或換行符時停止讀取
對結束符的處理 :get()將換行符留在輸入流中,這樣接下來的輸入操作首先看到的書換行符,而getline()抽取並丟棄輸入流中的換行符,用get()讀取字符串時可以用一個cin.get()處理留在輸入流中的換行符
1 cin.get(array1,10); 2 cin.get(); 3 cin.get(array2,10);
cin.get(array_name, Arsize)當輸入的字符串超長時,不會引起cin函數的錯誤,后面的cin操作會繼續執行,只是直接從緩沖區中取數據。但是cin.getline()當輸入超長時,會引起cin函數的錯誤,后面的cin操作將不再執行
3.4 cin.peek()
返回輸入中的下一個字符,但不抽取輸入流中的字符,也就是僅查看,不抽取。比如屏蔽空格
1 while( cin.peek() == ' ' ) 2 cin.get();
3.5 cin.ignore();cin.read();cin.gcount();
cin.ignore(),接收兩個參數,比如:cin.ignore(200,'\n')讀取並丟棄輸入流中的200個字符或是到達第一個換行符為止
cin.read(),接收兩個參數,讀取指定數目的字節,並將它們存儲在指定的位置中,char gross[144] cin.read(gross,144),一般與cout.write()一起用
cin.gcount(),返回最后一個非格式化抽取方法讀取的字符數,意味着由get(),getline(),ignore(),read()方法讀取的字符會被統計,而不是>>
1 cout<<"輸入一段字符:"; 2 cin.ignore(5,'\n'); 3 char num[20]; 4 cin.read(num,10); 5 cout<<"抽取的字符數:"<<cin.gcount()<<endl; 6 cout.write(num,10)<<endl;