zoukankan      html  css  js  c++  java
  • feof()出现的问题及解决办法

    C语言feof()函数的使用

    正确的应该是feof返回0表示文件没有结束,返回1,表示结束。feof实际观察的是上次读操作的内容,也就是上次读操作fread返回的值,如果读操作的返回值表明读取的不是空,那feof就返回0,如果上次读操作失败了,则feof返回1,表示读取完了。而fread返回值是表示正确读取的块数,如果不够,则返回0。那么我们看一下下面的程序:

    while(1)

    {

      if(feof(fp1))

      {

        break;

      }

      else

      {

        tmpint = fread(&(tmp[k]),1,1,fp1);

        k++;

      }

    }

    如果fp1指向的文件有256个字节,那么运行结束后,k的值为257。原因是由于在fread读取k=255的时候,文件其实就应该完了,但是freadk=255这次读取中,其返回值是1,因此进入k=256循环后,feof仍然返回的是1。因此k++也会再执行一次,因此,k变成了257。当进入k=257循环内,feof发现上次读操作失败了,因为上次fread返回了0,此刻break。最后k=257,比实际的文件大小大了一。所以在用feof的时候要多多注意

     

    解决方法:

    fgets(str,80,fp);

    while(!feof(fp)) //fgets取值成功,feof()返回0,fp指针偏移量向后移动一个字节,fgets取值失败feof()返回EOF

    {

       fputs(str,stdout);

       fgets(str,80,fp);

    }

    fputc(ch ,fp)//成功返回ch,错误返回0

    ch = fgetc(fp)//成功返回所得的字符,出错或者失败返回EOF

     

    fgets(str,80,fp); //成功返回str的地址,出错或者失败返回NULL

    fputs()//成功返回0,出错返回非零

    fprintf(FILE *fp,char *format,args,...)//把args的值以format指定的格式输出到fp所指定的文件中,成功返回实际输出的字符数

    fcanf(fp,char *format,args...)//把fp指定的文件按format指定的格式将数据送到arg所指定的内存,成功返回输入数据的个数,失败返回-1

     

    int fread(char *pt,unsigned size,unsigned n,FILE *fp)//从fp所指定的文件中读取长度为size的n个数据项,存到fp所指向的内存区,成功返回所读的数据项个数,如遇文件结束或者出错返回0

    int fwrite(char *ptr,unsigned size, unsigned n,FILE*fp)//把ptr所指向的n*size个字节输出到fp所指向的文件,成功返回写到fp文件里的数据项个数

     

    while(fgets() != NULL)

    {  

      fputs(str,stdout); //先打印

       fgets(str,80,fp);//取得的字符要先经过判断

    }

     

     

  • 相关阅读:
    ASP.net中页面事件的先后顺序
    我回来了
    ASP.NET中添加引用不能显示
    VS2008中MVC无法打开项目文件,此安装不支持该项目类型
    windows2003 IIS错误
    C#中使用TimeSpan计算两个时间的差值
    javascript做在翻译
    GridView导出EXCEL
    用资源管理器限制大数据量查询
    linux单机配置DG过程记录
  • 原文地址:https://www.cnblogs.com/siguoya/p/3481664.html
Copyright © 2011-2022 走看看