feof()函數以及EOF

c 中的feof()函數,用來檢測當前文件流上的文件結束標誌,判斷是否文件的尾部。

函數int feof(FILE *fp) 檢測到文件結束符則返回一個非0值,否則返回0.

Note:當文件內部的位置指針指向文件結束符時,並不會立即設置FILE結構中的文件結束標識,只有再執行一次讀操作,纔會設置文件結束標誌,再調用feof()纔會返回一個非0值.

feof.c

#include<stdio.h>
#include<stdlib.h>

int main()
{
        FILE *fp;
        char keyword[10];
        int value;
        int times=1;
        fp = fopen("dicts", "r"); //打開dicts文本文件
        fscanf(fp, "%s%d", keyword, &value);
        printf("Read times: %d\n", times);

        while(!feof(fp))
        {
                printf("%s--%d\n", keyword, value);
                fscanf(fp, "%s%d", keyword, &value);
                times++;
                printf("Read times: %d\n", times);
        }
}

dicts 文本文件

while  1
for  2
if  3
string  4

文件只有四行,但是在讀第五次的時候,才退出while,因爲在第四次讀取的時候雖然已經到了文件尾部,但沒有立即設置FILE結構中的文件結束標識,因此第四次讀取完之後,feof(fp)仍然返回的0。到第五次讀取完之後,feof(fp)返回的纔是一個非0值。

c中的EOF End of File 在表示操作系統中數據源中沒有更多的數據可讀取。

EOF在c中實際上是一個宏定義,值爲-1,可以用來判斷文本文件的結束,但是不能用來判斷二進制文件的結束。因爲文本文件中的所有字符都是使用ASCII碼值存放的,範圍是0-127,不可能出現-1,當讀入的字符值爲-1時就說明讀到了文件尾部。

EOF.c

#include<stdio.h>
#include<stdlib.h>


int main()
{
        FILE *fp;
        char temp;
        fp = fopen("dicts", "r");
        printf("%d\n", EOF);
        while((temp=fgetc(fp))!=EOF)
                printf("%c", temp);
}               

ubuntu
EOF 標誌在標準輸入中由ctrl+d(liunx下)或者ctrl+z(win下)產生

EOF1.c

#include<stdio.h>
#include<stdlib.h>


int main()
{       
        char temp;

        while((temp=getchar())!=EOF)
        {       
                printf("%c", temp);
        }
}

標準的輸入都有緩衝區,來存儲數據
當緩衝區中有數據:按下ctrl+d輸出緩衝區的內容,再次按下ctrl+d才表示EOF,纔會結束輸入
當緩衝區沒有數據:按下ctrl+d就代表EOF
回車也表示輸出緩衝區的內容,但是回車’\n’也是一個字符,會產生一個ASCII碼值放到緩衝區中,但是使用ctrl+d或者ctrl+z來輸出緩衝區內容時,並不會產生一個字符,也不會放到緩衝區中。

非阻塞式和阻塞式

非阻塞式:按下結束標識符就立即響應
阻塞式:按下結束標識符不會響應,只有當按下回車的時候纔會對之前的結束標識符進行檢測。

在linux下EOF標誌符(ctrl+d)的檢測時非阻塞式。而在windows下EOF標識符(ctrl+z)的檢測是阻塞式。
因此在win下如果在輸入ctrl+z之後又輸入了數據之後纔回車,後面的數據並不會輸入。
如果想要輸入ctrl+d,先按ctrl+v然後可以輸入ctrl+d,同樣如果想要輸入ctrl+v,只需要按兩下ctrl+v 即可。

立即回顯與延遲迴顯

輸入字符的立即回顯:   是非緩衝的(unbuffered)或直接輸入的一個實例,表示所鍵入的字符對正在等待的程序變爲立即可用。
輸入字符的延遲迴顯:   是緩衝(buffer)輸入的一個實例,所鍵入的字符被收集並存儲在緩衝區中,當按下回車之後所鍵入的字符塊對程序變爲可用。
在linux終端下輸入命令都是回顯的非緩衝輸入也就是立即回顯,鍵入的字符會在屏幕上顯示。但是我們在終端輸入密碼時都是不回顯非緩衝輸入,鍵入的字符不會顯示在屏幕上。

緩衝分爲兩類:

完全緩衝(fully buffered):當緩衝區滿時被清空。
行緩衝(line-buffered):遇到一個換行符時將被清空緩衝區。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章