搞懂C语言中的EOF是什么
2025-06-12 00:51:32在C语言中,EOF是包含在头文件
相信不少人刚开始跟我有一样的疑问,为啥要选EOF(更准确的讲也就是值-1)作为文件结束的标志?
这就要涉及到另外一个知识点 :
这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII码值的形式存放的,ASCII表示的范围是0—127,而EOF的值的是-1,在文本文件中可以更好的与普通字符区分。通常情况下,读取文件时,当EOF的值出现在读取的字符中,表示已经读取到了文件的结尾。
如何来结束文件输入?
相信有不少同学认为按下enter键,输入就结束了。事实上不是这样的,输入的方式有键盘输入,文件输入,流媒体输入等很多方式,里面也不会帮你按下enter键。所以我们需要一个字符,一个任何文件都不会用到的字符----EOF(End Of File)。
在Windows系统中,可以通过Ctrl+Z来表示EOF。
示例一:先看看getchar的用法;getchar()是接收键盘输入一个字符。
当我们输入字符ab时,getchar()只接收到了字符a;我们先把接收到的字符赋给整型变量ch,此时ch=97(存放的是字符a的ascII码值);再用putchar(ch)打印。putchar(ch)是打印一个字符。相当于printf("%c",ch);
实例二:
我们先来了解一下无缓冲输入和缓冲输入:
无缓冲输入:用户输入字符后,程序立刻将这个字符打印出来。
缓冲输入:用户输入字符后,字符会存入一个缓冲区中,直到用户按下enter键,才会打印缓冲区的字符。
接下来执行代码首先进入我们的while循环,先输入字符a,判断这个字符a是否和EOF相等,若不相等,则执行putchar()函数,此时用户输入的字符a存储在缓冲区中,但没有按下Enter键,那么程序即使执行到putchar(),也不会将这个字符打印出来。依次判断输入的字符b和c。当用户按下Enter键之后,计算机刷新缓冲区,putchar()将这个缓冲区的内容打印出来。
当看到这里,很多同学肯定会像我一样迷惑,putchar()函数不应该还是向屏幕打印一个字符吗?
查阅了很多资料,看到有一位博主说 “无论是printf还是putchar,其本质都是一样的,都是刷新缓冲区,将缓冲区的内容打印出来”。
所以当你正常使用getchar()的时候,你输入一个字符再按回车,此时你按下回车,已经刷新了缓冲。所以putchar()也将打印一个字符到屏幕上。如果你使用while循环用getchar()接收两个字符,再用putchar()函数打印,也会在屏幕上打印出两个字符。
实例三:
#include
int main()
{
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认(Y/N):>");
ret = getchar();
if (ret =='Y')
{
printf("确认成功");
}
else
{
printf("确认失败");
}
return 0;
}
上面的代码的运行逻辑显然不是我们想要的。当我输入123456按下回车时,程序并没有让我输入而是直接打印确认失败。为什么????
因为输入函数scanf()和getchar()在他们各自的语句执行前,会去一个叫做输入缓冲区的地方查看有没有自己想要的内容。如果有则直接拿走使用,不再等待输入,如果没有才会等待输入。
解释本程序:当我们输入字符123456按下回车时,输入缓冲里面存放着123456\n。scanf()拿走自己想要的123456,此时缓冲区还剩下一个\n(回车键),而当运行到getchar()的时候,去检查发现输入缓冲区还存放着\n,即直接拿走,不再等待输入。
那么如何解决上面这个代码?
即再加入一个getchar()读走缓冲区的\n,让缓冲区无内容,当执行ret=getchar()时程序等待输入。
int main()
{
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认(Y/N):>");
getchar();
ret=getchar();
if (ret =='Y')
{
printf("确认成功");
}
else
{
printf("确认失败");
}
return 0;
}
此时程序正确运行。
以上仅为个人理解,若有不对的地方,还请评论区打出来,愿意学习和改正。