| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 999 人关注过本帖
标题:关于文件进行中,文件内莫名出现多余码空间,但更改文件开与关的位置,则不 ...
只看楼主 加入收藏
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
结帖率:84.21%
收藏
已结贴  问题点数:30 回复次数:3 
关于文件进行中,文件内莫名出现多余码空间,但更改文件开与关的位置,则不会,为什么
void addanother(CON *p)
{
       fflush(stdin);
       printf("请输入通讯录新成员信息:\n名字:");
       fgets(p->name,MAX,stdin);
       printf("\n地址:");
       fgets(p->address,MAX,stdin);
       printf("\n电话号码:");
       fgets(p->phone,MAX,stdin);
       printf("\n分组:");
       fgets(p->type,MIN,stdin);
}

以下两段代码只有fclose与fopen的位置不同。
void add()      //文件输入出错代码
{
    int i=1,temp1,j=0,temp2,r;//变量声明与初始化
    CON *p,*b;
    fpos_t t;
    FILE *f;
    f=fopen(file1,"rb+");
    p=(CON *)malloc(sizeof(CON));
    b=(CON *)malloc(sizeof(CON));
    while(i)
    {
       addanother(p);    //输入新成员信息
   A:  printf("\n\t\t\t\t\t\t\t是否保存如下信息:\n\n【姓名】%s\n【地址】%s\n【电话】%s\n【组别】%s\n\t\t\t\t\t\t\t选择是(1)或否(0)\n\t\t\t\t\t\t\t选择:",p->name,p->address,p->phone,p->type);
       fflush(stdin);
       r=scanf("%d",&temp1);
       if(temp1!=1&&temp1!=0||r!=1)goto A;
       else if(temp1==0)break;
       else if(temp1==1)
       {
           do
           {
               fgetpos(f,&t);
               r=fread(b,sizeof(CON),1,f);
           }while(r!=0&&b->name[0]!=0);//填补之前删除内容的空间
           fsetpos(f,&t);
           j=fwrite(p,sizeof(CON),1,f);
           if(j==1)printf("\n\t\t\t\t\t\t\t保存成功!!!\n");
           else printf("\n\t\t\t\t\t\t\t保存失败!!!\n");                                            
        B: printf("\n\t\t\t\t\t\t\t是否继续添加通讯录?填写是(1)或否(0)\n\t\t\t\t\t\t\t输入:");//此处为是否继续输入新成员判断
           r=scanf("%d",&temp2);
           if(temp2==1&&r==1)i=1;
           else if(temp2==0&&r==1)i=0;
           else goto B;
       }  
    }
    fclose(f);
    free(p);
    free(b);
}



void add()      //文件输入正确代码
{
    int i=1,temp1,j=0,temp2,r;//变量声明与初始化
    CON *p,*b;
    fpos_t t;
    FILE *f;
   
    p=(CON *)malloc(sizeof(CON));
    b=(CON *)malloc(sizeof(CON));
    while(i)
    {
       f=fopen(file1,"rb+");
       addanother(p);    //输入新成员信息
   A:  printf("\n\t\t\t\t\t\t\t是否保存如下信息:\n\n【姓名】%s\n【地址】%s\n【电话】%s\n【组别】%s\n\t\t\t\t\t\t\t选择是(1)或否(0)\n\t\t\t\t\t\t\t选择:",p->name,p->address,p->phone,p->type);
       fflush(stdin);
       r=scanf("%d",&temp1);
       if(temp1!=1&&temp1!=0||r!=1)goto A;
       else if(temp1==0)break;
       else if(temp1==1)
       {
           do
           {
               fgetpos(f,&t);
               r=fread(b,sizeof(CON),1,f);
           }while(r!=0&&b->name[0]!=0);//填补之前删除内容的空间
           fsetpos(f,&t);
           j=fwrite(p,sizeof(CON),1,f);
           if(j==1)printf("\n\t\t\t\t\t\t\t保存成功!!!\n");
           else printf("\n\t\t\t\t\t\t\t保存失败!!!\n");
            fclose(f);                                          
        B: printf("\n\t\t\t\t\t\t\t是否继续添加通讯录?填写是(1)或否(0)\n\t\t\t\t\t\t\t输入:");//此处为是否继续输入新成员判断
           r=scanf("%d",&temp2);
           if(temp2==1&&r==1)i=1;
           else if(temp2==0&&r==1)i=0;
           else goto B;
       }  
    }
    free(p);
    free(b);
}

有点迷糊,知道fopen与fclose的位置问题造成的却不知原因,求哥哥姐姐们帮忙看下
搜索更多相关主题的帖子: 文件 CON printf 输入 sizeof 
2018-03-26 01:25
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
收藏
得分:0 
可能是弱智问题,但就挂在弱智问题上。别太嫌弃我,帮我看下呗
2018-03-26 01:26
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:30 
第2个 add() 不是在返回前 fclose(f),且是在有条件执行fclose的,有可能返回前没有执行到fclose。
如果过程中fclose,跟着没返回,有可能在随后执行代码中与文件相关的地方出现问题。

[此贴子已经被作者于2018-3-26 05:00编辑过]

2018-03-26 04:58
TIMFannie
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2017-10-15
收藏
得分:0 
回复 3楼 吹水佬
哦,对,这里是存在这个问题,感谢。我原来的问题是第一个add()函数头fopen  函数尾fclose ,函数内继续向文件内添加内容,文件内会出现一堆不相干的字。这里搞不太懂
2018-03-26 22:01
快速回复:关于文件进行中,文件内莫名出现多余码空间,但更改文件开与关的位置, ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017997 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved