標準輸入cin的返回值以及讀入未知數目資料的問題

2021-06-19 17:08:55 字數 1504 閱讀 2878

一、標準輸入cin的返回值

首先輸入操作符「>>」接受乙個istream物件作為其左運算元,接受乙個物件為其右運算元,讀取資料並儲存到右運算元中,並返回其左運算元作為結果。以語句std::cin>>value為例,其左運算元為std::cin,右運算元為value,執行這條語句的結果是從標準輸入讀取乙個值,存放在value中,並返回std::cin。

istream的物件cin有四種狀態:cin.eof()、cin.bad( )、cin.fail( )、cin.good( )。cin.good( )方法是檢測標準輸入流的有效狀態,如果流有效則返回true;如果cin.eof( )、cin.bad( )、cin.fail( )三者任何乙個被設定為true,則cin.good( )為false。

二、讀入未知數目的基本型別資料(value為字元型、整型、浮點型等)時迴圈體的退出問題

while(std::cin >> value)這個語句括號裡實際是檢測cin.good()方法的返回值,如果cin.good()返回為true,則執行迴圈體。當cin執行錯誤,或者標準輸入流結束的時候,while條件才不滿足。

下面看看退出迴圈體的情況:

1、當在windows下遇到ctrl+z(unix下為ctrl+d)或者eof時,表示終止輸入,此時cin.eof( )的返回值被設定為true,cin.good()返回false,迴圈體退出。

2、當輸入型別與定義的value型別不同時,比如value是int型而輸入字元,那麼cin在嘗試將輸入的字元讀為int型資料失敗,cin.fail( )的返回值被設定為true,cin.good()返回false,迴圈體退出。

例子:#include

int main()

windows下結束迴圈的方法:回車,ctrl+z,回車。

原因解釋如下:

當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車時,cin就會檢測輸入緩衝區中是否有了可讀的資料。cin還會對鍵盤上是否有作為流結束標誌的ctrl+z或者ctrl+d鍵按下進行檢查。檢查方式有兩種:阻塞式以及非阻塞式。阻塞式檢查方式指的是只有在回車鍵按下後才對之前是否有ctrl+z或者ctrl+d鍵按下進行檢查,非阻塞式是指按下ctrl+z或者ctrl+d鍵後立即響應。windows系統中一般採用阻塞式檢查ctrl+z,unix\linux一般採用非阻塞式檢查ctrl+d。

windows系統中這種檢查方式還有另外乙個特點,就是如果緩衝區中有可讀的資料則不會檢測ctrl+z,這是因為還有要讀的資料,故不能認為到了流的末尾。因此結束的方式為:回車,ctrl+z,回車。第乙個回車使cin將緩衝區的資料讀入,然後ctrl+z作為流結束標誌,第二個回車引發阻塞式檢查,檢查到結束標誌後輸入結束,迴圈也隨之終止。

經過實驗,上述方法可行。如果沒有第乙個回車,則不能正常終止輸入,自己理解可能是因為輸入緩衝中有資料要讀,所以即使按下了ctrl+z 再按回車也不會去檢查輸入是否結束。

ps:還有一點需要知道,ctrl+z產生的不是乙個普通的ascii碼值,也就是說它產生的不是乙個字元,所以不會像其它從鍵盤上輸入的字元一樣呢鞥夠放在輸入緩衝區。

cin 返回值 表示式值

今天看到如下語句 while cin m n 心中冒出想一 竟的念頭。操作符 和 的返回值是啥,作為bool表示式來用又會產生什麼值?帶著疑問我去找尋標準庫檔案。就以cin 為例,開啟標頭檔案,找到類模板basic istream的定義,摘出這麼兩個語句來 typedef basic istream...

標準函式返回值iResult

在函式執行中,返回值要考慮是否成功 錯誤 錯誤資訊 附加返回訊息。在經過長久摸索後,簡化成乙個標準返回結果。public class iresult error 執行成功為0,否則為錯誤 message 執行的錯誤訊息 data data5 object型別,隨意定義。使用例項 public ire...

scanf,cin以及其返回值

本人認為資料處理是非常重要的,如果能在輸入時候進行處理會省下很多事情。1 從scanf 角度看輸入 如果使用 d說明符,scanf 函式開始每次讀取乙個輸入字元,它跳過空白字元 空格,製表符和換行符 直到遇到乙個非空白字元,並持續讀取和儲存字元直到它遇到乙個非數字的字元。如果使用 c說明符,那麼所有...