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);

    <span class="hljs-keyword">while</span>(!feof(fp))
    {
            <span class="hljs-keyword">printf</span>(<span class="hljs-string">"<span class="hljs-variable">%s</span>--<span class="hljs-variable">%d</span>\n"</span>, keyword, value);
            fscanf(fp, <span class="hljs-string">"<span class="hljs-variable">%s</span><span class="hljs-variable">%d</span>"</span>, keyword, &amp;value);
            <span class="hljs-keyword">times</span>++;
            <span class="hljs-keyword">printf</span>(<span class="hljs-string">"Read times: <span class="hljs-variable">%d</span>\n"</span>, <span class="hljs-keyword">times</span>);
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

dicts 文本文件

while  1
for  2
if  3
string  4
 
  • 1
  • 2
  • 3
  • 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);
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

ubuntu
EOF 标志在标准输入中由ctrl+d(liunx下)或者ctrl+z(win下)产生

EOF1.c

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

int main()
{
char temp;

    <span class="hljs-keyword">while</span>((temp=getchar())!=EOF)
    {       
            <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%c"</span>, temp);
    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

标准的输入都有缓冲区,来存储数据
当缓冲区中有数据:按下ctrl+d输出缓冲区的内容,再次按下ctrl+d才表示EOF,才会结束输入
当缓冲区没有数据:按下ctrl+d就代表EOF
回车也表示输出缓冲区的内容,但是回车’\n’也是一个字符,会产生一个ASCII码值放到缓冲区中,但是使用ctrl+d或者ctrl+z来输出缓冲区内容时,并不会产生一个字符,也不会放到缓冲区中。

非阻塞式和阻塞式

非阻塞式:按下结束标识符就立即响应
阻塞式:按下结束标识符不会响应,只有当按下回车的时候才会对之前的结束标识符进行检测。

 
  • 1
  • 2

在linux下EOF标志符(ctrl+d)的检测时非阻塞式。而在windows下EOF标识符(ctrl+z)的检测是阻塞式。
因此在win下如果在输入ctrl+z之后又输入了数据之后才回车,后面的数据并不会输入。
如果想要输入ctrl+d,先按ctrl+v然后可以输入ctrl+d,同样如果想要输入ctrl+v,只需要按两下ctrl+v 即可。

立即回显与延迟回显

输入字符的立即回显:   是非缓冲的(unbuffered)或直接输入的一个实例,表示所键入的字符对正在等待的程序变为立即可用。
输入字符的延迟回显:   是缓冲(buffer)输入的一个实例,所键入的字符被收集并存储在缓冲区中,当按下回车之后所键入的字符块对程序变为可用。

 
  • 1
  • 2
在linux终端下输入命令都是回显的非缓冲输入也就是立即回显,键入的字符会在屏幕上显示。但是我们在终端输入密码时都是不回显非缓冲输入,键入的字符不会显示在屏幕上。

缓冲分为两类:

完全缓冲(fully buffered):当缓冲区满时被清空。
行缓冲(line-buffered):遇到一个换行符时将被清空缓冲区。

 
  • 1
  • 2
posted @ 2022-11-21 18:54  TwcatL_tree  阅读(10)  评论(0编辑  收藏  举报