1、使用原始的cin進行輸入
如果程序要使用循環來讀取來自鍵盤的文本輸入,則必須有辦法知道何時停止讀取。如何知道這一點呢?一種方法使選擇某個特殊字符——有時被稱為哨兵字符(sentinel character),將其作為停止標記。
下面程序,遇到#字符時停止讀取輸入。該程序計算讀取的字符數,并回顯這些字符,即在屏幕上顯示讀取的字符。按下鍵盤上的鍵不能自動將字符顯示到屏幕上,程序必須通過回顯輸入字符來完成這項工作。通常,這種任務由操作系統處理。在這個程序中,操作系統和測試程序都回顯輸入。運行完畢后,該程序報告處理的總字符數























為什么該程序省略了空格呢?原因在cin。讀取char值時,與讀取其他基本類型一樣,cin將忽略空格和換行符。因此輸入中的空格沒有被回顯,也沒有被包括在計數內。
更為復雜的是,發送給cin的輸入被緩沖。這意味著只有在用戶按下回車鍵后,他輸入的內容才會被發送給程序。這就是在運行該程序時,可以在#后面輸入字符的原因。按下回車鍵后,整個字符序列將被發送給程序,但程序在遇到#字符后將結束對輸入的處理。
2、使用cin.get(char)進行補救
通常,逐個字符讀取輸入的程序需要檢查每個字符,包括空格、制表符和換行符。cin所屬的istream類(在iostream中定義)包含一個能夠滿足這種要求的成員函數。具體地說,成員函數cin.get(ch)讀取輸入中的下一個字符(即使它是空格),并將其賦給變量ch。使用這個函數調用替換cin>>ch,可以修補第一個程序的問題。






















如果熟悉C語言,可能以為這個程序存在嚴重的錯誤。cin.get(ch)調用將一個值放在ch變量中,這意味著將修改該變量的值。在C語言中,要修改變量的值,必須將變量的地址傳遞給函數。但上面程序中,調用cin.get()時,傳遞的是ch,而不是&ch。在C語言中,這樣的代碼無效,但在C++中有效,只要函數將參數聲明為引用即可。引用是C++中的一種新類型。頭文件iostream將cin.get(ch)的參數聲明為引用類型,因此該函數可以修改其參數的值。
3、文件尾條件
如果輸入來自文件,則可以使用一種功能更強大的技術——檢測文件尾(EOF)。C++輸入工具和操作系統協同工作,來檢測文件尾并將這種信息告知程序。讀取文件中的信息同cin和鍵盤輸入存在兩個相關的地方:首先,很多操作系統(包括UNIX和MS-DOS)支持重定向,允許用文本替換鍵盤輸入。加入,假設在MS-DOS中有一個名為gofish.exe的可執行程序和一個名為fishtale的文本文件,則開一個在DOS提示符下輸入下面的命令:gofish <fishtale。這樣,程序將從fishtale文件(而不是鍵盤)獲取輸入。<符號式UNIX和DOS上的重定向操作符。其次,很多操作系統都允許通過鍵盤來模擬文件尾條件。如果編程環境能夠檢測EOF,可以在程序中使用重定向的文件,也可以使用鍵盤輸入,并在鍵盤中輸入中模擬EOF。那么,檢測到EOF后,cin將兩位(eofbit和failbit)都設置為1??梢酝ㄟ^成員函數eof()來查看eofbit是否被設置;如果檢測到EOF,則cin.eof()將返回bool值true,否則返回false。同樣,如果eofbit或failbit被設置為1,則fail()成員函數返回true,否則返回false。注意,eof()和fail()方法報告最近讀取的結果,也就是說,它們在事后報告,而不是預先報告。因此應將cin.eof()或cin.fail()測試放在讀取后。fail(),相對于eof(),可用于更多的實現中。






















程序運行狀況:

通過使用重定向,可以用該程序來顯示文本文件,并報告它所包含的字符數。