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);
}
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):遇到一個換行符時將被清空緩衝區。