為成為國際語言,C++必須能處理需要16位的國際字元集Unicode,于是在傳統的8位char型的基礎上添加了wchar_t字元類型。在程式包含iostream檔案時,将自動建立8個流對象:cin、cout、cerr、clog以及相對應的用于寬字元流的:wcin、wcout、wcerr、wclog。
可以将hex oct dec與cin連用,用于指定将輸入的整數的進制
inta;
cin>>hex>>a;//輸入12h
cout<<a<<endl;//輸出18d
當把輸入傳給字元數組時,會自動在後面加上一個空值字元,使之成為一個字元串。
char name[10];
cin>>name;//當輸入>=10時,會出錯,因為會自動加'\0'
cout<<name<<endl;
cin檢查輸入
int a;
cin>>a;
cout<<a<<endl;
cin>>name;
當輸入123sdf或者123 sdf時,結果是a=123 name=sdf
流狀态:
由3個ios_base元素組成:eofibtbadbit failbit。
當cin到達檔案末尾是,它将設定eofbit
當cin未能讀取預期的字元時(如類型不對),它将設定failbit
當cin試圖讀取不可通路的檔案時,可能設定failbit
當有無法診斷的錯誤時,設定badbit
當全部3個狀态都設定為0時,說明一切正常
設定狀态
clear:
clear();//将使用預設參數0,這将清楚全部3個狀态位:eofibt badbit failbit
clear(eofbit);//将狀态設定為eofbit,另外兩個狀态被清除
而setstate()隻影響參數對應的位
setstate(eofbit);//将設定eofbit,不會影響其它位
get與getline
get(char&)與get(void)不跳過空白的單字元
get(char*,int,char)與getline(char*,int,char)預設情況下是讀取整行而不是一個單詞。
get(void)傳回的是int型,因為它可能傳回EOF=-1,則下面是錯誤的
cin.get().get()
到底采用哪一種輸入方式?
如果希望跳過空白,則使用cin>>ch
如果希望程式檢查每一個字元,則用cin.get(ch)
get()與getline()的主要差別在于:get()将換行符或則者分界符留在輸入流中,這樣接下來的輸入操作首先看到的将是換行符或者是分界符,而getline()抽取并丢棄輸入流中的換行符
ignore(int n,char)将讀取并丢棄接下來的n個字元或直到到達第一個char。
int a;
cin.ignore(5,'3');
cin>>a;//輸入1312
cout<<a<<endl;//輸出12
cin.read()與cin.get()不同的是,read()不會在輸入之後加’\0’,是以不能将輸入轉為字元串
cin.peek()用于傳回下一個輸入的字元,但是并不把這個字元從緩存中讀取出來。
Cin.putback()用于将一個字元插入到輸入字元串中,即下一個要讀取的字元就是你插入的字元。
Cout
可以直接輸出數組名和字元指針以及字元常量。
注意如何輸出字元串位址
Ostream定義了put()和write()方法,分别用于字元的顯示與字元串的顯示
cout.put()是用來輸出單個字元的 比如cout.put('\n'); cout.put('a');
cout.write(*s,num);是用來輸出字元串的。*s是字元串的位址,num是想要輸出的字元串的長度,空格也算就算是空字元也算在内。
例如:cout.write(“tengweitw”,4);将輸出teng
Write()方法也可用于數值資料:
longval=560031841;
cout.write((char*)&val,sizeof(int));//結果為aha!
Val被顯示為4個字元的組合,由于val的十六進制為21616861,而61h變為十進制正好是97即a,68h=104d=h,21h=33=!
Cout進行輸出時,并不會立刻發送到目的地,而是先存儲在緩存區,直到緩存區填滿,然後程式重新整理緩存區,把内容發出去,并清空緩存區。這樣做可以節省大量時間,畢竟不希望每次有資料就立即發送,因為這樣要存取硬碟很多次,浪費時間。我們可以調用flush來重新整理,如下面都可以:
cout<<"hello"<<flush;
flush(cout);
cout.flush();
進制間轉換
十進制:dec
八進制: oct
十六進制: hex
Dec oct hex 這些控制符不是成員函數。它們的作用是長期的,直達重新設定為止。
調整字段寬度:
Int width();//傳回目前設定
Int width(int i);//設定寬度為i
注意width隻影響接下來的一個項目而已,然後恢複預設值
填充字元:
Cout.Fill(‘*’)// 它們的作用是長期的,直達重新設定為止。
精度設定
在預設情況下,精度為顯示的總位數,在定點模式和科學模式下,精度指的是小數點後面的位數,預設精度為6(末尾0不顯示)
Cout.precision(2); // 它們的作用是長期的,直達重新設定為止。
列印末尾的0和小數點
cout.setf(ios_base::showpoint);
Setf()的用法
setf()用于控制小數點被顯示是的其它幾個格式選項。
Setf()有兩個函數原型:
其中fmtfl和mask的可選值如下:
fmtfl
format flag value
mask
field bitmask
left, right or internal
adjustfield
dec, oct or hex
basefield
scientific or fixed
floatfield
具體可以檢視此連結:http://www.cplusplus.com/reference/ios/ios_base/setf/
具體調用如下:
上面所用的一些函數都可以用下面的标準控制符來調用:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIzMjN0IjMwcTMxAjNwMTMwIzLcRXZu5ibkN3Yuc2bsJmLn1Wavw1LcpDc0RHaiojIsJye.jpg)