C语言再学习 -- EOF、feof函数、ferror函数

12 篇文章 0 订阅

EOF详解

EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。

EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

#define EOF (-1)

在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //文件结尾 示例  
  2. #include<stdio.h>  
  3. void main()  
  4. {  
  5.     FILE *fp;  
  6.     char c;  
  7.     fp=fopen("abc.txt","r");  
  8.     while((c=fgetc(fp))!=EOF)  
  9.         printf("%c",c);  
  10.     fclose(fp);  
  11. }  


除了表示文件结尾,EOF还可以表示标准输入的结尾。但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。

1)getchar()的返回值与EOF进行比较。如果不相同,则你还没有到达文件结尾。换句话说,你可以使用如下表达式:

while ((ch = getchar ()) != EOF)

Unix系统中,你能通过在一行开始键入Ctrl+D来从键盘模拟文件结束条件;DOS系统则使用Ctrl+Z来达到这个目的。

顺便提一句,Linux中按下Ctrl+Z,表示将该进程中断,在后台挂起,用fg 命令可以重新切回到前台;按下Ctrl+C表示终止该进程。

如果真的想输入Ctrl+D,则必须先按下Ctrl+V,然后就可以输入Ctrl+D,系统就不会认为这是EOF信号。Ctrl+V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl+V,连续输入两次就行了。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>    
  2. int main(void)    
  3. {    
  4.     char ch;    
  5.     while ((ch = getchar ()) != EOF)    
  6.         putchar (ch);    
  7.     return 0;    
  8. }    


2) scanf()函数  返回一个整数值,这个值是成功读取的项目数,或者当遇到文件结束时返回一个EOF(文件结尾符)。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. int main (void)  
  3. {  
  4.     int n = 0;  
  5.     while (scanf ("%d", &n) != EOF)  
  6.     {  
  7.         printf ("hello world!\n");  
  8.     }  
  9.     return 0;  
  10. }  

3)fclose ( )函数 如果成功返回 0,否则返回EOF(-1)。

4)如果读入字符时发现已经到达文件结尾,getc ( )函数 会返回一个特殊值EOF。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. int ch;  
  2. FILE * fp;  
  3. fp = fopen ("abc.txt""r");  
  4. while ((ch = getc (fp)) != EOF)  
  5. {  
  6.     putchar (ch);  
  7. }  

feof ( )函数:
函数原型:

int feof(FILE * stream);
所在头文件:
stdio.h
返回值:
返回非零值代表已到达文件尾
函数说明:
feof ( ) 用来侦测是否读取到了文件尾, 尾数stream 为fopen()所返回之文件指针. 如果已到文件尾则返回非零值, 其他情况返回0
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //示例  
  2. #include <stdio.h>  
  3. int main ()  
  4. {  
  5.    FILE *fp;  
  6.    int c;  
  7.    fp = fopen("abc.txt","r");  
  8.    if(fp == NULL)   
  9.    {  
  10.       perror("打开文件时发生错误");  
  11.       return(-1);  
  12.    }  
  13.    while(1)  
  14.    {  
  15.       c = fgetc(fp);  
  16.       if( feof(fp) ) //到文件结尾 feof (fp) 为 1  
  17.       {   
  18.           break ;  
  19.       }  
  20.       printf("%c", c);  
  21.    }  
  22.    fclose(fp);  
  23.    return(0);  
  24. }  

EOF与feof函数区别
EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),EOF的16进制代码为0xFF(十进制为-1),因此可以用EOF作为文件结束标志。 当把数据以二进制形式存放到文件中时,就会有-1值的出现,因此不能采用EOF作为二进制文件的结束标志。
为解决这一个问题,ASCI C提供一个feof函数,用来判断文件是否结束。feof函数既可用以判断二进制文件又可用以判断文本文件。

注意:feof ( )函数,读取文件的最后一个字符以后,C 语言的feof ( ) 函数依然返回 0,表明没有到达文件结尾;只有当fgetc ( ) 向后再读取一个字符(即越过最后一个字符),feof()才会返回一个非零值,表示到达文件结尾。
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //示例  
  2. #include <stdio.h>    
  3. int main ()    
  4. {    
  5.    FILE *fp;    
  6.    int c;    
  7.    fp = fopen("abc.txt","r");    
  8.    if(fp == NULL)     
  9.    {    
  10.       perror("打开文件时发生错误");    
  11.       return(-1);    
  12.    }    
  13.    c = fgetc(fp);    
  14.    while(!feof (fp))    
  15.    {    
  16.       printf("%c", c);    
  17.       c = fgetc(fp); //打印所有的数据之后,需要再fgetc(fp)一次,函数feof(fp)的返回值才为真  
  18.    }    
  19.    fclose(fp);    
  20.    return(0);    
  21. }    
[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //改良版  
  2. #include <stdio.h>    
  3. int main ()    
  4. {    
  5.    FILE *fp;    
  6.    int c;    
  7.    fp = fopen("abc.txt","r");    
  8.    if(fp == NULL)     
  9.    {    
  10.       perror("打开文件时发生错误");    
  11.       return(-1);    
  12.    }    
  13.    while(1)    
  14.    {    
  15.       c = fgetc(fp);    
  16.       if( feof(fp) ) //到文件结尾 feof (fp) 为 1    
  17.       {     
  18.           break ;    
  19.       }    
  20.       printf("%c", c);    
  21.    }    
  22.    fclose(fp);    
  23.    return(0);    
  24. }    


ferror()函数
函数原型:

int ferror(FILE *stream)
返回值:
如果设置了与流关联的错误标识符,该函数返回一个非零值,否则返回一个零值。
函数描述:
ferror,函数名,在调用各种输入输出函数(如 putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。 它的一般调用形式为 ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4.    FILE *fp;  
  5.    char c;  
  6.    fp = fopen("file.txt""w");  
  7.    c = fgetc(fp);  
  8.    if( ferror(fp) )  
  9.    {  
  10.       printf("读取文件:file.txt 时发生错误\n");  
  11.    }  
  12.    clearerr(fp);  
  13.    if( ferror(fp) )  
  14.    {  
  15.       printf("读取文件:file.txt 时发生错误\n");  
  16.    }  
  17.    fclose(fp);  
  18.    return(0);  
  19. }  
  20. 假设我们有一个文本文件 file.txt,它是一个空文件。让我们编译并运行上面的程序,因为我们试图读取一个以只写模式打开的文件,这将产生以下结果。  
  21. 读取文件:file.txt 时发生错误  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值