• <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>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            EOF與feof()

            Posted on 2008-08-18 19:12 Prayer 閱讀(453) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            判斷文件結束有兩種方法:EOF和feof()
            查看stdio.h可以看到如下定義:
            #define EOF (-1)

            #define _IOEOF 0x0010
            #define feof(_stream) ((_stream)->_flag & _IOEOF)

            由此可以看出,這兩種方式的原理是不同的。
            有人說EOF只能用于文本文件,其實不然,還要看定義的變量的類型。下面這段程序對文本文件和二進制文件都可以:
            int c;
            while((c=fgetc(fp)) != EOF)
            {
             printf("%X\n", c);
            }
            如果讀到了FF,由于c定義為int型,所以實際上c=0x000000FF,不等于EOF(-1=0xFFFFFFFF),因此不會誤判為文件結尾。

            但是如果把c定義為char類型,就有可能產生混淆了。
            char c;
            while((c=fgetc(fp)) != EOF)
            {
             printf("%X\n", c);
            }
            因為文本文件中存儲的是ASCII碼,而ASCII碼中FF代表空值(blank),一般不使用,所以如果讀文件返回了FF,說明已經到了文本文件的結尾。但是如果是二進制文件,其中可能會包含FF,因此不能把讀到EOF作為文件結束的條件,此時只能用feof()函數。

            在VC里,只有當文件位置指針(fp->_ptr)到了文件末尾,然后再發生讀/寫操作時,標志位(fp->_flag)才會被置為含有_IOEOF。然后再調用feof(),才會得到文件結束的信息。因此,如果運行如下程序:
            char c;
            while(!feof(fp))
            {
             c = fgetc(fp);
             printf("%X\n", c);
            }
            會發現多輸出了一個FFFFFFFF,原因就是在讀完最后一個字符后,fp->flag仍然沒有被置為_IOEOF,因而feof()仍然沒有探測到文件結尾。直到再次調用fgetc()執行讀操作,feof()才能探測到文件結尾。這樣就多輸出了一個-1(即FFFFFFFF)。
            正確的寫法應該是:
            char c;
            c = fgetc(fp);
            while(!feof(fp))
            {
             printf("%X\n", c);
             c = fgetc(fp);
            }

            這么說其實feof()是可以用EOF來代替的嘍?不是,這里還有一個問題。fgetc返回-1時,有兩種情況:讀到文件結尾或是讀取錯誤。因此我們無法確信文件已經結束, 因為可能是讀取錯誤! 這時我們需要feof()。

            久久综合狠狠综合久久综合88 | 久久这里只有精品18| 久久亚洲精品无码aⅴ大香| 亚洲国产另类久久久精品黑人| 97久久精品无码一区二区| 亚洲国产成人久久综合碰| 久久香蕉国产线看观看精品yw| 久久66热人妻偷产精品9| 精品久久久久久无码不卡| 老色鬼久久亚洲AV综合| 久久精品中文字幕第23页| 狠狠色丁香久久综合五月| 久久精品国产清自在天天线| 国产精品免费久久久久影院| 精品免费久久久久久久| 久久精品国产WWW456C0M| 亚洲AV无码久久精品狠狠爱浪潮| 国内精品久久久久国产盗摄| 免费精品99久久国产综合精品| 久久永久免费人妻精品下载| 久久精品不卡| 夜夜亚洲天天久久| 国内精品久久久久久久久电影网| 久久久噜噜噜久久中文字幕色伊伊| 狠狠色婷婷综合天天久久丁香 | 久久av无码专区亚洲av桃花岛| 日产精品久久久久久久| 99久久99久久精品国产片果冻| 久久人人妻人人爽人人爽| 久久亚洲国产精品成人AV秋霞 | 久久最近最新中文字幕大全| 人妻无码αv中文字幕久久琪琪布| 亚洲欧美一级久久精品| 欧洲性大片xxxxx久久久| yellow中文字幕久久网| avtt天堂网久久精品| 久久久精品2019免费观看| 亚洲中文字幕无码久久2020| 国产综合久久久久久鬼色| 国产69精品久久久久9999APGF | 久久天天躁狠狠躁夜夜不卡|