前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >feof()函数以及EOF

feof()函数以及EOF

作者头像
Twcat_tree
发布2022-11-30 20:59:08
1.4K0
发布2022-11-30 20:59:08
举报
文章被收录于专栏:二猫の家二猫の家

c 中的feof()函数,用来检测当前文件流上的文件结束标志,判断是否文件的尾部。

函数int feof(FILE *fp) 检测到文件结束符则返回一个非0值,否则返回0.

Note:当文件内部的位置指针指向文件结束符时,并不会立即设置FILE结构中的文件结束标识,只有再执行一次读操作,才会设置文件结束标志,再调用feof()才会返回一个非0值.

feof.c
代码语言:perl
复制
#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);

代码语言:javascript
复制
    <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>);
    }

}

dicts 文本文件
代码语言:c#
复制
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
代码语言:perl
复制
#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
ubuntu

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

EOF1.c
代码语言:c++
复制
#include<stdio.h>
#include<stdlib.h>

int main() { char temp;

代码语言:javascript
复制
    <span class="hljs-keyword">while</span>((temp=getchar())!=EOF)
    {       
            <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%c"</span>, temp);
    }

}

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

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

 
 12

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

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

 
 12
在linux终端下输入命令都是回显的非缓冲输入也就是立即回显,键入的字符会在屏幕上显示。但是我们在终端输入密码时都是不回显非缓冲输入,键入的字符不会显示在屏幕上。
缓冲分为两类:
代码语言:javascript
复制
完全缓冲(fully buffered):当缓冲区满时被清空。
行缓冲(line-buffered):遇到一个换行符时将被清空缓冲区。

 
 12
本文参与?腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-09-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体同步曝光计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • c 中的feof()函数,用来检测当前文件流上的文件结束标志,判断是否文件的尾部。
    • 函数int feof(FILE *fp) 检测到文件结束符则返回一个非0值,否则返回0.
      • feof.c
        • dicts 文本文件
        • c中的EOF End of File 在表示操作系统中数据源中没有更多的数据可读取。
          • EOF.c
            • EOF1.c
              • 非阻塞式和阻塞式
                • 立即回显与延迟回显
                  • 在linux终端下输入命令都是回显的非缓冲输入也就是立即回显,键入的字符会在屏幕上显示。但是我们在终端输入密码时都是不回显非缓冲输入,键入的字符不会显示在屏幕上。
                • 缓冲分为两类:
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
                http://www.vxiaotou.com