c 中的feof()函数,用来检测当前文件流上的文件结束标志,判断是否文件的尾部。
函数int feof(FILE *fp) 检测到文件结束符则返回一个非0值,否则返回0.
Note:当文件内部的位置指针指向文件结束符时,并不会立即设置FILE结构中的文件结束标识,只有再执行一次读操作,才会设置文件结束标志,再调用feof()才会返回一个非0值.
feof.c
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);
dicts 文本文件
文件只有四行,但是在读第五次的时候,才退出while,因为在第四次读取的时候虽然已经到了文件尾部,但没有立即设置FILE结构中的文件结束标识,因此第四次读取完之后,feof(fp)仍然返回的0。到第五次读取完之后,feof(fp)返回的才是一个非0值。
c中的EOF End of File 在表示操作系统中数据源中没有更多的数据可读取。
EOF在c中实际上是一个宏定义,值为-1,可以用来判断文本文件的结束,但是不能用来判断二进制文件的结束。因为文本文件中的所有字符都是使用ASCII码值存放的,范围是0-127,不可能出现-1,当读入的字符值为-1时就说明读到了文件尾部。
EOF.c
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
int main()
{
char
标准的输入都有缓冲区,来存储数据
当缓冲区中有数据:按下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 即可。
立即回显与延迟回显
在linux终端下输入命令都是回显的非缓冲输入也就是立即回显,键入的字符会在屏幕上显示。但是我们在终端输入密码时都是不回显非缓冲输入,键入的字符不会显示在屏幕上。
缓冲分为两类: