-
-
[转帖]论ANSI C下的feof
-
发表于: 2016-7-4 10:45 4506
-
已经有好几个人问我这段代码怎么了:
fp = fopen("1.txt", "r");
while(!feof(fp))
printf("%d ", fgetc(fp));
复制代码
如果fp指向的文件中只有1个“0”,那么运行后会输出
48 -1
复制代码
,-1从何而来?
首先我们需要下面这个滑稽的东西:
The function feof() tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the function clearerr().
我决定保留这段英文(别问我为什么)
但是实际上这段并没有什么用,因为它不能解决我们的问题
继续看1下fopen,在其中可以看到:
When fopen() put into a file from the hard disk to the buffer, it will be the end of the buffer add an EOF.
就从这里可以知道,
在硬盘中的文件末尾实际上并没有EOF,但是将它读入到缓冲区的时候会加上EOF
因此问题来了:feof规定不需要读取给定的文件指针,那么它如何判断是否到了末尾?
应该很容易想到,FILE是struct,可以在其中增加1个flag变量。
那么这个flag变量何时会被改变?下面是重点:
If the fscanf(), fgetc(), fgets(), fread() read the EOF, it will set the file EOF flag to 1.
因此很容易了,
由于当时指针在文件末尾,并且fgetc读到了EOF,但是feof还没有来的及判断,
printf就已经把EOF的值输出了。如果还是不明白,看下面的只有文字的图:
那么就可以很容易的修正了。
Code1:
char ch;
fp = fopen("1.txt", "r");
while(1)
{
ch = fgetc(fp);
if(feof(fp))
break;
printf("%d ", ch);
}
复制代码
Code2:
char ch;
fp = fopen("1.txt", "r");
ch = fgetc(fp);
while(!feof(fp))
{
printf("%d ", ch);
ch = fgetc(fp);
}
复制代码
就是这些。如果看不懂也没关系,那是我的错...
本文转载于13aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6W2P5s2c8Y4L8$3c8Q4x3X3g2U0L8$3#2Q4x3V1k6@1K9s2u0W2j5h3c8Q4x3X3b7J5z5e0g2Q4x3X3b7I4i4K6u0V1x3g2)9J5k6h3S2@1L8h3H3`.
fp = fopen("1.txt", "r");
while(!feof(fp))
printf("%d ", fgetc(fp));
复制代码
如果fp指向的文件中只有1个“0”,那么运行后会输出
48 -1
复制代码
,-1从何而来?
首先我们需要下面这个滑稽的东西:
The function feof() tests the end-of-file indicator for the stream
pointed to by stream, returning non-zero if it is set. The end-of-file
indicator can only be cleared by the function clearerr().
我决定保留这段英文(别问我为什么)
但是实际上这段并没有什么用,因为它不能解决我们的问题
继续看1下fopen,在其中可以看到:
When fopen() put into a file from the hard disk to the buffer, it will be the end of the buffer add an EOF.
就从这里可以知道,
在硬盘中的文件末尾实际上并没有EOF,但是将它读入到缓冲区的时候会加上EOF
因此问题来了:feof规定不需要读取给定的文件指针,那么它如何判断是否到了末尾?
应该很容易想到,FILE是struct,可以在其中增加1个flag变量。
那么这个flag变量何时会被改变?下面是重点:
If the fscanf(), fgetc(), fgets(), fread() read the EOF, it will set the file EOF flag to 1.
因此很容易了,
由于当时指针在文件末尾,并且fgetc读到了EOF,但是feof还没有来的及判断,
printf就已经把EOF的值输出了。如果还是不明白,看下面的只有文字的图:
那么就可以很容易的修正了。
Code1:
char ch;
fp = fopen("1.txt", "r");
while(1)
{
ch = fgetc(fp);
if(feof(fp))
break;
printf("%d ", ch);
}
复制代码
Code2:
char ch;
fp = fopen("1.txt", "r");
ch = fgetc(fp);
while(!feof(fp))
{
printf("%d ", ch);
ch = fgetc(fp);
}
复制代码
就是这些。如果看不懂也没关系,那是我的错...
本文转载于13aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3&6W2P5s2c8Y4L8$3c8Q4x3X3g2U0L8$3#2Q4x3V1k6@1K9s2u0W2j5h3c8Q4x3X3b7J5z5e0g2Q4x3X3b7I4i4K6u0V1x3g2)9J5k6h3S2@1L8h3H3`.
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
- [分享]httpd.ini实现301重定方法 1628
- [原创]乌云要关闭了吗 35747
- [原创]PHP开发的在线记事本系统,服务器程序! 6706
- [转帖]超实用的linux快捷键操作 5036
赞赏
雪币:
留言: