C++ 語言并未定義任何輸入輸出(IO)語句,取而代之,包含了一個全面的标準庫(iostream)來提供IO機制(以及很多其他設施)。
iostream庫包含兩個基礎類型istream和ostream,分别表示輸入流核輸出流。一個流就是一個字元序列,是從IO裝置讀出或寫入IO裝置的。術語“流”想要表達的是,随着時間的推移,字元是順序生成或消耗的。
标準輸入輸出對象
标準塊定義了4個IO對象。為了處理輸入,我們使用了一個名為cin的istream類型的對象。這個對象也被稱為标準輸入。對于輸出,我們使用一個名為cout的ostream類型的對象。此對象也被稱為标準輸出。标準庫還定義了其他兩個ostream對象,名為cerr和clog。我們通常用cerr來輸出警告和錯誤資訊,是以它也被稱為标準錯誤。而clog用來輸出程式運作時的一般性資訊。
系統通常将程式所運作的視窗與這些對象關聯起來。是以,當我們讀取cin,資料将從程式正在運作的視窗讀入,當我們向cout、cerr和clog寫入資料時,将會寫到同一個視窗。
向流寫入資料
輸出運算符<<接受兩個運算對象:左側的運算對象必須是一個ostream對象,右側的運算對象是要列印的值。此運算符将給定的值寫到給定的ostream對象中。輸出運算符的計算結果就是其左側運算對象。即,計算結果就是我們寫入給定值的那個ostream對象。
例如:
std::cout<<"Enter two numbers:"<<std::endl;
我們的輸出語句使用兩次<<運算符。因為此運算符傳回其左側的運算對象,是以第一個運算符的結果成為了第二個運算符的左側運算對象。這樣,我們就可以将輸出請求連接配接起來。是以,我們的表達式等價于:
(std::cout<<"Enter two numbers:|")<<std::endl;
鍊中每個運算符的左側運算對象都是相同的,在本例中是std::cout。我們也可以用兩條語句生成相同的輸出:
std::cout<<"Enter two numbers:";
std::cout<<std::endl;
第二個運算符列印endl,這是一個被稱為操縱符的特殊值。寫入endl的效果是結束目前行,并将與裝置關聯的緩沖區中的内容刷到裝置中。緩沖重新整理操作可以保證到目前為止程式所産生的所有輸出都真正寫入輸出流中,而不是僅停留在記憶體等待寫入流。
使用命名空間
std::cout和std::endl使用了std限制,而不是直接使用了cout和endl。字首std::指明名字cout和endl是定義在名為std的命名空間中的。命名空間可以幫助我們避免不經意的名字定義沖突,以及使用庫中相同名字導緻的沖突。标準庫定義的所有名字都在命名空間std中。
從流讀取資料
輸入運算符>>與輸出運算符類似,它接受一個istream作為其左側運算對象,接受一個對象作為其右側運算對象。它從給定的istream讀入資料,并存入給定對象中。與輸出運算符類似,輸入運算符傳回其左側運算符對象作為其計算結果,是以,表達式
std::cin>>v1>>v2;
等價于
(std::cin>>v1)>>v2;
由于此運算符傳回其左側運算對象,是以我們可以将一系列輸入請求合并到單一語句中。本例中的輸入操作從std::cin讀入兩個值,并将第一個值存入v1,将第二個值存入v2.
讀入數量不定的輸入資料
例如
while(std::cin>>value)
while循環條件的求值就是執行表達式
std::cin>>value
此表達式從标準輸入讀取下一個數,儲存在value中。輸入運算符傳回其左側運算對象,在本例中是std::cin。是以,此循環條件實際上檢測的是std::cin。
當我們使用一個istream對象作為條件時,其效果是檢測流的狀态。如果流是有效的,即流未遇到錯誤,那麼檢測成功。當遇到檔案結束符(end-of-file),或遇到一個無效的輸入時(例如讀入的值與輸入到的變量類型不同時),istream對象的狀态就是變為無效。處于無效狀态的istream對象會使條件變為假。
是以,我們的while循環會一直執行直到遇到檔案結束符(或輸入錯誤)。