iostream庫相當複雜,因此我們無法在這些教程中完整地介紹它。但是,我們將向您展示最常用的功能。在本節中,我們將介紹輸入類(istream)的各個方面。
注意:本課程中的所有i / o功能都位於std命名空間中。這意味著所有i / o物件和函式都必須以「std ::」為字首,或者必須使用「using namespace std;」語句。
提取運算元
正如現在許多課程中所見,我們可以使用提取運算子(>>)從輸入流中讀取資訊。c ++為所有內建資料型別預定義了提取操作,您已經了解了如何為自己的類過載提取操作符。
讀取字串時,提取運算子的乙個常見問題是如何防止輸入溢位緩衝區。給出以下示例:
char buf[10];
cin >> buf;
如果使用者輸入18個字元會發生什麼?緩衝區溢位,發生了不好的事情。一般來說,對使用者將輸入多少個字元進行任何假設都是乙個壞主意。
解決這個問題的一種方法是使用操縱器。操縱器是用於當與提取(>>)或插入(<<)運算子應用於修改流的物件。你已經廣泛使用的乙個操縱器是「endl」,它既可以列印換行符,也可以重新整理任何緩衝輸出。c ++提供了乙個稱為setw的操作符(在iomanip.h標頭檔案中),可用於限制從流中讀入的字元數。要使用setw(),只需提供要作為引數讀取的最大字元數,然後將其插入到輸入語句中,如下所示:
#include char buf[10];
cin >> setw(10) >> buf;
此程式現在只讀取流中的前9個字元(為終結器留出空間)。任何剩餘的字元將保留在流中,直到下一次提取。
提取和空格
到目前為止我們忽略的一件事是提取操作符使用「格式化」資料,也就是說,它跳過空格(空格,製表符和換行符)。
看看以下程式:
int main()
當使用者輸入以下內容時:
hello my name is alex
提取運算子會跳過空格和換行符。因此,輸出是:
hellomynameisalex
通常情況下,您需要獲取使用者輸入但不要丟棄空白。為此,istream類提供了許多可用於此目的的函式。
其中最有用的是get()函式,它只是從輸入流中獲取乙個字元。這是與上面相同的程式使用get():
int main()
現在,當我們使用輸入時:
hello my name is alex
輸出是:
hello my name is alex
get()也有乙個字串版本,需要讀取最多字元數:
int main()
如果我們輸入:
hello my name is alex
輸出是:
hello my n
請注意,我們只讀取前10個字元(我們不得不為終結符留下乙個字元)。剩餘的字元留在輸入流中。
關於get()的乙個重要注意事項是它不會讀取換行符!這可能會導致一些意外結果:
int main()
如果使用者輸入:
hello!
該計畫將列印:
hello!
然後終止!為什麼不再要10個字元呢?答案是因為第乙個get()讀取到換行符然後停止。第二個get()看到cin流中仍有輸入並嘗試讀取它。但是第乙個字元是換行符,所以它立即停止了。
因此,還有乙個名為getline()的函式與get()完全相同,但也會讀取換行符。
int main()
即使使用者輸入帶有換行符的字串,此**也會按預期執行。
如果您需要知道上次呼叫getline()時提取了多少字元,請使用gcount():
int main()
std :: string的特殊版本的getline()
有乙個特殊版本的getline(),它位於istream類之外,用於讀取std :: string型別的變數。此特殊版本不是ostream或istream的成員,並且包含在字串標頭中。以下是其使用示例:
#include #include int main()
一些更有用的istream函式
您可能希望使用一些更有用的輸入函式:
ignore()丟棄流中的第乙個字元。
ignore(int ncount)丟棄第乙個ncount字元。
peek()允許您從流中讀取字元而不從流中刪除它。
unget()返回讀回流中的最後乙個字元,以便下次呼叫時再次讀取它。
putback(char ch)允許您將您選擇的字元放回流中,以便下次呼叫時讀取。
istream包含上述功能的許多其他功能和變體,可能很有用,具體取決於您需要做什麼。但是,這些主題更適合專注於標準庫的教程或書籍(例如nicolai m. josuttis 出色的「the c ++ standard library」)。
C 基礎教程物件導向(學習筆記5(2))
在編寫具有多個建構函式的類 大多數建構函式 時,必須為每個建構函式中的所有成員指定預設值會導致冗餘 如果更新成員的預設值,則需要觸控每個建構函式。從c 11開始,可以直接為普通類成員變數 不使用static關鍵字的變數 提供預設初始化值 class rectangle void print int ...
C 基礎教程物件導向(學習筆記(23))
過載一元運算子 與您目前看到的運算子不同,正 負 和邏輯非 運算子都是一元運算子,這意味著它們只能在乙個運算元上執行。因為它們僅對它們所應用的物件進行操作,所以通常將一元運算子過載實現為成員函式。所有三個運算元都以相同的方式實現。讓我們看一下我們如何在前面的例子中使用的cents類上實現operat...
C 基礎教程物件導向(學習筆記(24))
過載比較運算子相對簡單,因為它們遵循我們在過載其他運算子時看到的相同模式。因為比較運算子都是不修改左運算元的二元運算子,所以我們將使過載的比較運算子宣告為友元函式。這是乙個帶有過載運算子 和operator!的car類的示例。include include class car friend bool...