• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            http://hi.baidu.com/zyb_debug/blog/item/cdfc2adf9b982451cdbf1a7e.html
            streams定義了兩個(gè)可用于布爾表達(dá)式的函數(shù)

            operator void*()   意義:stream是否出錯(cuò)(相當(dāng)于!fail())
            operator !()       意義:stream是否已出錯(cuò)(相當(dāng)于fail())

            我們可以運(yùn)用operator void*()在控制結(jié)構(gòu)中簡潔測出stream的當(dāng)前狀態(tài):

            while (std::cin)
            {
            }
            控制結(jié)構(gòu)中的布爾條件值并不是非得直接轉(zhuǎn)換為bool不可,只要能夠轉(zhuǎn)換為某個(gè)整數(shù)型別或指針型別就夠了。
            轉(zhuǎn)換為void* 常常是為了在同一表達(dá)式中讀入對(duì)象并測試是否成功:

            if(std::cin>> x)
            {
            //reading x was successful
            }
            正如先前的討論,表達(dá)式
            std::cin >> x
            會(huì)返回cin,所以讀入x后,上述語句變?yōu)?br>if(std::cin)
            {
            }

            此時(shí)的cin被用于條件判斷,所以cin會(huì)調(diào)用 operator void*,返回"stream是否發(fā)生錯(cuò)誤"

            以上技術(shù)的幾個(gè)典型應(yīng)用就是以循環(huán)讀入對(duì)象并處理
            while(std::cin >> obj)
            {
            std:: cout << obj << std::endl;
            }

            如果failbit或badbit被設(shè)立,該循環(huán)就立即中止---出現(xiàn)錯(cuò)誤或者讀到(end-of-file).

            我們可以利用operator!進(jìn)行相反測試,它會(huì)返回"strean是否已發(fā)生錯(cuò)誤",也就是說如果failbit 或badbit被設(shè)立就會(huì)返回true用法如下:
            if(!std::cin)
            {
            //the stream is not OK
            }

            上述文字出于 <<c++標(biāo)準(zhǔn)程序庫-自修教程與參考手冊(cè)->>p600 侯捷-孟巖譯

            花了幾天時(shí)間終于將這本書閱讀完了,里面的streambuf沒有理解,是我功底不夠的緣故吧...
            開學(xué)了,人多了起來,繼續(xù)靜靜的學(xué)習(xí)

            Posted on 2009-09-06 14:38 zyb_debug 閱讀(2121) 評(píng)論(3)  編輯 收藏 引用

            Feedback

            # re: 關(guān)于while(cin)  回復(fù)  更多評(píng)論   

            2009-09-06 19:06 by OwnWaterloo
            >> 控制結(jié)構(gòu)中的布爾條件值并不是非得直接轉(zhuǎn)換為bool不可,只要能夠轉(zhuǎn)換為某個(gè)整數(shù)型別或指針型別就夠了。

            選void* 而不是整數(shù)類型是有原因的。 可以避免如下代碼被編譯通過:
            cin<< xxx;


            streambuf是重點(diǎn)之一。
            istream 負(fù)責(zé)格式化輸入, ostream負(fù)責(zé)格式化輸出。
            streambuf 如其名那樣, 作為格式化結(jié)果與最終輸出目的地之間的緩存。

            而stringstream, fstream, 沒有太多的功能。
            格式化功能是繼承自iostream。
            而它們使用的是stringbuf, filebuf, 是streambuf的子類, 提供一些額外功能。
            stringstream, fstream比iostream多的功能, 正是其buf提供的。

            # re: 關(guān)于while(cin)  回復(fù)  更多評(píng)論   

            2009-09-06 20:16 by zyb_debug
            @OwnWaterloo
            恩 istream ostream里面的文件讀取主要是通過streambuf,維護(hù)這個(gè)東西實(shí)現(xiàn)的。
            我估計(jì)是閱讀的太快了,總是感覺有些理解不了。
            而且我現(xiàn)在讀取文件數(shù)據(jù)都用的是XML,IO這塊沒費(fèi)心。
            其實(shí)我覺得最有用的是STL里的算法和容器

            # re: 關(guān)于while(cin)  回復(fù)  更多評(píng)論   

            2009-09-09 23:39 by Chuck
            傳說有一個(gè)版本的cin中是這么來處理轉(zhuǎn)換的

            operator int ();

            int i;
            while ( cin>>i ) {}

            那么這一句就會(huì)被編譯為 cin這個(gè)整數(shù)值 右移 i位

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品久久久久久久久久影院| 国产精品免费福利久久| 一本色道久久88综合日韩精品 | 国产亚洲精品久久久久秋霞| 日本人妻丰满熟妇久久久久久| 久久精品国产91久久综合麻豆自制| 久久精品成人影院| 精品久久久久久久久午夜福利| 欧美一区二区精品久久| 久久免费看黄a级毛片| 亚洲综合久久综合激情久久| 久久久无码精品亚洲日韩京东传媒| 久久99热只有频精品8| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 午夜精品久久久久久| 久久久久久国产精品免费无码| 久久精品国产99国产精品| 久久久久久久久无码精品亚洲日韩| 久久久人妻精品无码一区| 久久久九九有精品国产| 熟妇人妻久久中文字幕| 亚洲国产综合久久天堂 | 久久伊人精品青青草原高清| 亚洲精品国产美女久久久| 久久久久九九精品影院| 精品无码人妻久久久久久| 国内精品久久久久久99蜜桃| 无码AV波多野结衣久久| 久久AV无码精品人妻糸列| 一97日本道伊人久久综合影院| 国产亚洲精午夜久久久久久 | 久久人妻少妇嫩草AV蜜桃| 亚洲国产成人久久精品影视| 国产成人精品久久一区二区三区| 狠狠色狠狠色综合久久 | 九九久久自然熟的香蕉图片| 色综合久久中文字幕无码| 久久久久久久久久久久中文字幕 | 亚洲色欲久久久久综合网| 性做久久久久久免费观看| 99久久做夜夜爱天天做精品|