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):遇到一个换行符时将被清空缓冲区。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章