• c fread()在判断文件结束时需要注意的一些事


    样本程序如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    typedef struct
    {
    int ele1;
    int ele2;
    char ch[20];
    }ttt;   //结构体.

    void addInfo(int *n)
    {
    FILE *file=fopen("wmx.dat","w");
    int i=0;
    ttt myttt;
    for(i=0;i<10;i++)   //初始化文件,输入10条记录.
    {
      myttt.ele1=((i+100)*7+i)%107;
      myttt.ele2=((i+309)*5+65)%43;
      strcpy(myttt.ch,"dkldfjd");
      (*n)++;
      fwrite(&myttt,sizeof(ttt),1,file); //写入.
    }
    fclose(file);
    }

    void readFile(int  *n)
    {
    FILE *file=fopen("wmx.dat","r");
    ttt myttt;
    if(file==NULL)
         {
          printf("打开文件失败.\n");
          exit(0);
         }
         while(!feof(file))         //此处打印的最结果是11条记录.
         {
          fread(&myttt,sizeof(ttt),1,file);
          printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
         // (*n)++;
         }
         fclose(file);
    }
    int main()
    {
    int n=0;
    addInfo(&n);
    readFile(&n);
    printf("%d\n",n);
    return 0;
    }

    问题处在fread上,用feof判断有问题,可以改为:
    while (1)
    {
        memset(&myttt, 0, sizeof(myttt));
        if (fread(&myttt, sizeof(ttt), 1, file) == 1)
        {
            printf();
        }
        else
        {
            break;
        }
    }

    原因:feof(file) 的作用是检测读取到的数据是否为文件结束。读完最后一行记录后,file->_flag 没有被置为_IOEOF,因为已经读取到记录了, feof() 没有探测到文件结尾。直到再次调用 fread()读取记录时,才获取文件结束标志,feof() 探测到文件结尾。
    当再次调用 fread(&myttt,sizeof(ttt),1,file); 时,myttt 没有获取任何内容,还是上次读取的数据,输出时,当然是跟上次一样。
    修改如下:
    void readFile(int  *n)
    {
    FILE *file=fopen("wmx.dat","r");
    ttt myttt;
    if(file==NULL)
    {
    printf("打开文件失败.\n");
    exit(0);
    }
    // 检测文件长度,如果大于 0,先读取一行。
    if(file->_bufsiz>0)
    {
    fread(&myttt,sizeof(ttt),1,file);
    }
    while(!feof(file)) //此处打印的最结果是11条记录.
    {
    printf("%d %d %s\n",myttt.ele1,myttt.ele2,myttt.ch);
    // 当读取完数据后,读取出文件结束标志,
    // 回到 while 时,就不再输出下一行了。
    fread(&myttt,sizeof(ttt),1,file);
    }
    fclose(file);
    }

  • 相关阅读:
    python jinja2模板分页效果
    vscode配置svn
    解决VSCODE打开新文件覆盖上一个窗口的问题
    vue所用插件整理
    vue bus总线
    create-react-app使用less
    react入门
    ES6|Object
    vue轮播插件--vue-awesome-swiper
    js/jq中遍历对象或者数组的函数(foreach,map,each)
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/2775962.html
Copyright © 2020-2023  润新知