白衣不依 2021-12-13 23:35 采纳率: 100%
浏览 51
已结题

为什么这个删除商品信息的函数,当库存中没有此商品时不能显示出无此商品的信息也不能返回菜单?

void omit(void) //删除商品信息
{
struct goods stock;
FILE *fp,*fp1;
char ch[20];
char f;
int flag=0;
do
{
fp=fopen("库存记录.dat","rb+");
fp=fopen("临时记录.dat","wb+");
flag=0;
if(fp==NULL)
{
printf("\t 不能打开文件! \n");
getchar();
exit(1);
}
printf("请输入你需要删除的商品名称:\n");
scanf("%s",ch);
while(!feof(fp))
{
if(fread(&stock,sizeof(stock),1,fp))
{
if(strcmp(ch,stock.name )==0)
{
printf("删除成功!\n");
flag=1;
}
else
{
fwrite(&stock,sizeof(stock),1,fp1);
}
}
}
fclose(fp);
fclose(fp1);
if(flag==0)
printf("没有找到该商品信息!\n");
//remove("库存记录.dat");
//rename("临时记录.dat","库存记录.dat");
printf("还需要删除其他商品吗?(y/n):\n");
f=getchar();
getchar();
}
while(f=='y'||f=='n');
printf("按任意键返回菜单");
getchar();
system("CLS");
menu();
}

  • 写回答

1条回答 默认 最新

  • 关注

    (1)
    scanf("%s",&ch);改成 scanf("%s",ch);
    ch本身就是数组的首地址,不需要在加&。
    (2)你的printf("没有找到该商品信息!\n");这个打印,每读一次文件,如果不满足条件就输出一次,这是不对的吧,应该是所有数据都读完以后,所有记录都不符合if条件再输出没找到
    (3)你的fp1这个文件没有打开啊,fwrite的时候怎么能写成功呢?
    (4)fp是用来读取文件的,打开的时候不应该是wb+,应该是rb+


    代码修改如下:

    
    
    void omit(void) //删除商品信息
    {
        struct goods sst;
        FILE *fp,*fp1;
        char ch[20];
        char f;
        int flag = 0; //新增1
        int cnt = 1;
        
        do
        {
            fp=fopen("库存记录.dat","rb+"); //修改1: fp是读文件,用rb+
            fp1 = fopen("临时记录.dat","wb+"); //修改2,
            flag = 0; //新增2:重置标记
            if(fp==NULL)
            {
                printf("\t 不能打开文件! \n");
                getchar();
                exit(1);
            }
            printf("请输入你需要删除的商品名称:\n");
            scanf("%s",ch); //修改3 去掉&
            while(!feof(fp))
            {
                if(fread(&sst,sizeof(sst),1,fp))
                {
                    printf("%d : %s\n",cnt,sst.name); //在这里显示一下读取的数据是否正确
                    cnt++;
                    if(strcmp(ch,sst.name )==0)
                    {
                        printf("删除成功!\n");
                        flag = 1; //新增3:找到要删除的产品
                    }
                    else
                    {
                        fwrite(&sst,sizeof(sst),1,fp1);
                        //printf("没有找到该商品信息!\n"); //修改4
                    }
                }
            }
            fclose(fp);
            fclose(fp1);
            //新增4
            if(flag==0)
                printf("没有找到该商品信息!\n"); 
            remove("库存记录.dat");
            rename("临时记录.dat","库存记录.dat");
            printf("还需要删除其他商品吗?(y/n):\n");
            f=getchar();
            getchar();
        }
        while(f=='y'||f=='n');
        printf("按任意键返回菜单");
        getchar();
        system("CLS");
        menu();
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 已采纳回答 12月14日
  • 修改了问题 12月14日
  • 创建了问题 12月13日

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教