天天看點

【C/C++】Cin與Cout                                      Cin

         為成為國際語言,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/

具體調用如下:

上面所用的一些函數都可以用下面的标準控制符來調用:

【C/C++】Cin與Cout                                      Cin
【C/C++】Cin與Cout                                      Cin
【C/C++】Cin與Cout                                      Cin