最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ cin不同狀態(tài)詳細講解

 更新時間:2022年10月19日 10:10:35   作者:Peak@  
cin是C++編程語言中的標準輸入流對象,即istream類的對象。cin主要用于從標準輸入讀取數(shù)據(jù),這里的標準輸入,指的是終端的鍵盤。此外,cout是流的對象,即ostream類的對象,cerr是標準錯誤輸出流的對象,也是ostream類的對象

前言

在C++中std::cin>>x,這是一條從std::cin中讀取輸入到x中的語句。而>>操作數(shù)是從標準輸入中讀取一個字符串,并把它保存在x對象中。

讀取操作包括:

1、從輸入流緩沖區(qū)緩存的輸入字節(jié)快中提取對應(yīng)于右操作數(shù)數(shù)據(jù)類型的字節(jié)字塊。如果緩存為空,則等待輸入設(shè)備提交字節(jié)塊。

2、再將字節(jié)子塊轉(zhuǎn)換為右操作數(shù)對應(yīng)類型的編碼存放在右操作數(shù)中。

對于cin之類的流對象有g(shù)ood和not good兩種狀態(tài),cin>>x讀取數(shù)據(jù)成功時,會返回good狀態(tài);cin>>x讀取數(shù)據(jù)失敗時,會返回not goot狀態(tài)。注意good狀態(tài)的流才能讀/寫流緩沖區(qū)的數(shù)據(jù);not good狀態(tài)的流會忽略即不執(zhí)行讀/寫操作。

反過來,流的讀/寫操作也會影響流的狀態(tài),成功的讀/寫操作會使流保持good狀態(tài);失敗的讀/寫操作會設(shè)置流的狀態(tài)變量的錯誤標志,表示流在讀/寫操作后處于某種錯誤(not good)的狀態(tài)。

流的錯誤狀態(tài)可以分為failbit、eofbit和badbit三種錯誤狀態(tài)。

常量failbiteofbitbadbit轉(zhuǎn)為10進制
ios::failbit1004
ios::eofbit0102
ios::badbit0011
ios::goodbit0000

基本讀取狀態(tài)的函數(shù)rdstate(),其余狀態(tài)讀取函數(shù)是good()、fail()、eof()、bad()等。

三種錯誤狀態(tài):

  • fail():讀取值與期望接受值的類型不兼容即錯誤格式,狀態(tài)變量的failbit被置位,fail()為真,進入fail狀態(tài)。這種錯誤是可恢復(fù)的,可重新設(shè)置流為good狀態(tài),繼續(xù)讀取數(shù)據(jù),但需要丟棄前面輸入的數(shù)據(jù)。
  • eof():讀取值為文件結(jié)束標記eof,此時cin會記錄該標記,狀態(tài)變量的eodbit和failbit被同時置位,eof()為真,進入eof狀態(tài)。
  • bad():由于輸入設(shè)備故障導(dǎo)致的數(shù)據(jù)丟失,狀態(tài)變量的badbit和failbit被置位,bad()為真,進入bad狀態(tài),這種錯誤不可恢復(fù),流對象將不可再用。

注意:當流處于錯誤狀態(tài)時,狀態(tài)變量的failbit總是被置位(true),因此有時候也可以將表達式!fail()作為判斷流是否為good的條件來使用。

介紹一下cin的三個函數(shù):

  • cin.clear():是用來更改cin的狀態(tài)標識符的,將cin的所有狀態(tài)值重設(shè)為有效值。
  • cin.sync():是用來清除緩存區(qū)的數(shù)據(jù)流的。
  • cin.ignore(n,ch):從輸入流中提取字符,提取的字符被忽略,不被使用,每拋棄一個字符,它都要計數(shù)和比較字符,如果計數(shù)值達到n或者被拋棄的字符是ch,則cin.ignore()函數(shù)執(zhí)行終止,否則繼續(xù)等待。

注意:當cin出錯時,先要用cin.clear()重置cin狀態(tài)值后,后面兩個函數(shù)才能起到作用,但cin.ignore()要比cin.sync()更加靈活。

一、下面給幾個案例

#include <iostream>
using namespace std;
int main()
{
    int x;
    cout << "請輸入一個整數(shù):";
    cin >> x;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

1、輸入正確且類型匹配的情況:

2、輸入一個字符時,類型不匹配的情況:

3、以eof結(jié)尾:

(在Windows下是輸入Ctrl+z,Linux下是輸入Ctrl+d,都要進行換行后再輸入)

二、當我們對這個程序進行改進后

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "請輸入一串整數(shù):";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    char y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

在代碼中用了一個循環(huán)輸入,提示輸入一串整數(shù),在前面四個數(shù)都是整數(shù)的情況下,而第五個數(shù)輸入了一個字符,后面兩個數(shù)仍然是整數(shù),但是當執(zhí)行時,sum的值卻是14,也就是說x成功保存了四個數(shù),這就是上面說的fail錯誤狀態(tài),x不能再讀出流緩沖區(qū)的數(shù)據(jù),這是因為第五個數(shù)是字符類型的,與x類型不匹配,再用clear()函數(shù)重置cin狀態(tài),由于y是char類型,z是int類型,后面的cin>>y和cin>>z又可以繼續(xù)讀出流緩沖區(qū)里的數(shù)據(jù)。

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "請輸入一串整數(shù):";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    cout << " clear后:" << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    int y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

這里只是將上面的char y改成了int y,可以看運行結(jié)果的不同,此時的cin.clear()雖然起作用,但由于流緩沖區(qū)里還有數(shù)據(jù),y和z會嘗試去讀取里面的數(shù)據(jù),而y的類型不匹配再次讓流的狀態(tài)變成fail狀態(tài),y和z就都不能讀取數(shù)據(jù)了,輸入y和z的值是程序自動初始化的。

#include <iostream>
using namespace std;
int main()
{
    int x;
    int sum = 0;
    cout << "請輸入一串整數(shù):";
    while (cin>>x)
    {
        sum += x;
    }
    cout <<"sum = " << sum << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    cout << endl;
    cin.clear();
    cin.sync();
    int y;
    cin >> y;
    int z;
    cin>>z;
    cout <<"y = " << y << endl;
    cout <<"z = " << z << endl;
    cout << " cin.good(): " << cin.good() << endl;
    cout << " cin.rdstste(): " << cin.rdstate() << endl;
    cout << " cin.fail(): " << cin.fail() << endl;
    cout << " cin.eof(): " << cin.eof() << endl;
    cout << " cin.bad(): " << cin.bad() << endl;
    return 0;
}

當在cin.clear()后面加上cin.sync()函數(shù)后,sync()函數(shù)會清除緩存區(qū)的數(shù)據(jù),此時緩存區(qū)里面就沒有數(shù)據(jù)了,對于cin>>y和cin>>z,就需要我們自己輸入數(shù)據(jù)了。

總結(jié)

對于cin的錯誤狀態(tài),我們可以用cin的其他幾個函數(shù)將其恢復(fù)成good狀態(tài),cin.clear()一般和cin.sync()一起使用。

參考書籍:Accelerated C++和Cpp_Primer_5

到此這篇關(guān)于C++ cin不同狀態(tài)詳細講解的文章就介紹到這了,更多相關(guān)C++ cin內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++?smart?pointer全面深入講解

    C++?smart?pointer全面深入講解

    一般在C/C++中,如果我們使用了pointer來指向某塊heap區(qū)域,當不再需要這塊區(qū)域的時候,我們需要手動刪除它。如果忘了的話,就會產(chǎn)生memory?leak
    2022-08-08
  • MFC程序設(shè)計常用技巧匯總

    MFC程序設(shè)計常用技巧匯總

    這篇文章主要介紹了MFC程序設(shè)計常用技巧,實例匯總了MFC程序設(shè)計中常見的問題與解決方法,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • 淺談c++中的while(cin)問題

    淺談c++中的while(cin)問題

    下面小編就為大家?guī)硪黄獪\談c++中的while(cin)問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C++帶有指針成員的類處理方式詳解

    C++帶有指針成員的類處理方式詳解

    這篇文章主要為大家詳細介紹了C++帶有指針成員的類處理方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C++之CWnd窗口框架實例

    C++之CWnd窗口框架實例

    這篇文章主要介紹了C++之CWnd窗口框架,實例分析了CWnd窗口框架的結(jié)構(gòu),如構(gòu)造函數(shù)、析構(gòu)函數(shù)、消息映射函數(shù)等,需要的朋友可以參考下
    2014-10-10
  • C語言 動態(tài)內(nèi)存分配詳解

    C語言 動態(tài)內(nèi)存分配詳解

    這篇文章主要介紹了C語言 動態(tài)內(nèi)存分配詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++詳細講解對象的構(gòu)造

    C++詳細講解對象的構(gòu)造

    當在參數(shù)化構(gòu)造函數(shù)中聲明對象時,必須將初始值作為參數(shù)傳遞給構(gòu)造函數(shù)。對象聲明的常規(guī)方法可能不起作用。構(gòu)造函數(shù)可以顯式或隱式調(diào)用,讓我們一起了解對象的構(gòu)造
    2022-04-04
  • 詳解C語言中index()函數(shù)和rindex()函數(shù)的用法

    詳解C語言中index()函數(shù)和rindex()函數(shù)的用法

    這篇文章主要介紹了C語言中index()函數(shù)和rndex()函數(shù)的用法,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,要的朋友可以參考下
    2015-08-08
  • C++ Boost Bind庫示例分析使用

    C++ Boost Bind庫示例分析使用

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C/C++動態(tài)分配與釋放內(nèi)存的區(qū)別詳細解析

    C/C++動態(tài)分配與釋放內(nèi)存的區(qū)別詳細解析

    以下是對C與C++中動態(tài)分配與釋放內(nèi)存的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09

最新評論

安新县| 仙桃市| 永吉县| 惠安县| 普兰店市| 香格里拉县| 凌云县| 会理县| 武胜县| 五家渠市| 龙州县| 仲巴县| 天气| 曲松县| 教育| 加查县| 胶南市| 宝山区| 大厂| 大埔县| 东乌珠穆沁旗| 唐河县| 香港 | 多伦县| 安乡县| 黄石市| 舞钢市| 望城县| 蛟河市| 雷山县| 双牌县| 黎城县| 濮阳县| 双鸭山市| 安福县| 林口县| 搜索| 三穗县| 桃园市| 南部县| 台湾省|