码迷,mamicode.com
首页 > 其他好文 > 详细

feof读字符串问题

时间:2014-09-29 00:13:56      阅读:207      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   使用   ar   文件   

feof()函数是我们在C语言中操作文件经常用到的一个函数。这个函数用来表示我们是否已经到了文件的末尾的下一个位置。不管是二进制文件,还是文本文件它都管用。对比EOF(一般宏定义为-1),EOF只能用来判断文本文件是否到达末尾,因为文本文件中的数字是用ASCII表示的,ASCII字符的取值范围是0~255。而二进制文件中可能存在-1,所以不能用EOF来判断结束。
我们使用feof经常遇到的一个问题是,用fgets读文件,然后用fputs打印。最后一行会打印两遍。
这是为什么了?
先说一下feof()函数
在stdio.h里有feof的定义:
#define _IOEOF 0x0010
#define feof(_stream) ((_stream)->_flag & _IOEOF)
由此可知只有当_flag=_IOEOF时,feof()才会返回1。在VC里,只有当 file position indicator(在Windows上是fp->_ptr)到了文件末尾,然后再发生读/写操作时,fp-> _flag才会被置为含有_IOEOF,然后再调用feof(),才会得到文件结束的信息。并不是file position indicator一指到文件尾,feof()就认为文件结束。也就是说只有文件指针到了文件末尾的下一个位置,feof()才会返回1。
程序如下:
 while(!feof(fp))
 { 
  fgets(str,80,fp);
  fputs(str,stdout);
 }
那么我们读最后一行之后,打印最后一行,这个时候feof()返回的是0.接着使用fgets读文件,由于fgets()函数在读文件时,会判断是否碰到了_IOEOF,如果一开始就碰到了,那么传递的数组的内容不会改变,也就是说还是最后一行的内容。这样最后一行就会打印两遍。fgets()函数定义在文章的最后面。
那么如何解决这个问题了。
只要正确使用feof()即可,如何正确使用呢?记住一个原则:先读取内容,然后用feof()判断。这样你在文件最后一行之后读文件,feof()会返回1。就不会打印了,修改之后的程序如下:
 fgets(str,80,fp);
 while(!feof(fp))
 {
  fputs(str,stdout);
  fgets(str,80,fp);
 }
 
解决方法二:不用feof(),使用fgets()的返回值判断.如果为NULL,说明碰到了文件结束。
  fgets(str,80,fp);
 while(!feof(fp))
 {
  fputs(str,stdout);
  fgets(str,80,fp);
 }
这样也能成功打印文件内容。
 
 
fgets.c文件里面的内容,这个应该是fgets函数的定义。
_TSCHAR * __cdecl _fgetts (
        _TSCHAR *string,
        int count,
        FILE *str
        )
{
        REG1 FILE *stream;
        REG2 _TSCHAR *pointer = string;
        _TSCHAR *retval = string;
        int ch;
        _VALIDATE_RETURN(( string != NULL ) || ( count == 0 ), EINVAL, NULL);
        _VALIDATE_RETURN(( count >= 0 ), EINVAL, NULL);
        _VALIDATE_RETURN(( str != NULL ), EINVAL, NULL);
                if (count == 0)
                {
                        return NULL;
                }
       
       
        stream = str;
        _lock_str(stream);
        __try {
#ifndef _UNICODE
        _VALIDATE_STREAM_ANSI_SETRET(stream, EINVAL, retval, NULL);
#endif 
        if(retval!=NULL)
                {
                        while (--count)
                        {
                                        if ((ch = _fgettc_nolock(stream)) == _TEOF)
                                        {
                                                        if (pointer == string) {
                                                                        retval=NULL;
                                                                        goto done;
                                                        }
                                                        break;
                                        }
                                        if ((*pointer++ = (_TSCHAR)ch) == _T(\n))
                                                        break;
                        }
                *pointer = _T(\0);
                }


done:
        ; }
        __finally {
                _unlock_str(stream);
        }
        return(retval);
}
http://blog.sina.com.cn/s/blog_5eb8ebcb0100qca5.html

 

feof读字符串问题

标签:style   blog   http   color   io   os   使用   ar   文件   

原文地址:http://www.cnblogs.com/leijiangtao/p/3999041.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!