关于一个C++的有关问题,RETURN 0退出不正常

关于一个C++的问题,RETURN 0退出不正常
int bianhaochaxun()//查询商品——按编号查询
{
cout<<"请输入要查询的商品编号!"<<endl;
int bianhao1;
int bianhao2;
cin>>bianhao2;
shangpin a(0," ",0,0);
ifstream in("f1.txt",ios::binary);
if(!in)
{
cout<<"无法打开商品库,请告知管理员\n\n"<<endl;
return 0;
}
for(int i=0;i<=2000;i++)
{
in.seekg(sizeof(shangpin)*i,ios::beg);
in.read((char *)&a,sizeof(shangpin));
bianhao1=a.geibianhao();
//cout<<"编号1:"<<bianhao1<<endl;
//cout<<"编号2:"<<bianhao2<<endl;
if(bianhao2==bianhao1)
{
if(a.geicunzai()==1)
{
if(a.geikucun()>=1)
{
cout<<"存在性"<<a.geicunzai()<<endl;
a.show();
in.close();
return 0;
}
else
{
cout<<"抱歉,该商品已售完,请联系管理员补货!以下是商品信息!"<<endl;
a.show();
in.close();
return 0;
}
}
else
{
cout<<"抱歉,您查询的商品已不存在!"<<endl;
in.close();
return 0;
}
}
else
continue;
}
cout<<"您输入的商品编号有误!请重新查询"<<endl;
in.close();
return 0;
}
int shanchushangpin() //删除商品
{
int bianhao1;
int bianhao2;
cout<<"请输入要删除商品的编号:"<<endl;
cin>>bianhao2;
shangpin a(0,"",0,0);
fstream io("f1.txt",ios::in|ios::out|ios::binary);
if(!io)
{
cout<<"无法打开商品库,请告知管理员\n\n"<<endl;
return 0;
}
for(int i=0;i<=2000;i++)
{
io.seekg(sizeof(shangpin)*i,ios::beg);
io.read((char *)&a,sizeof(shangpin));
bianhao1=a.geibianhao();
if(bianhao1==bianhao2)
{
cout<<"查询到商品信息如下:"<<endl;
a.show();
cout<<"确认要删除请按1,否则按2"<<endl;
int banduan;
cin>>banduan;
if(banduan==1)
{
a.cuncunzai(0);
cout<<"删除成功!"<<endl;
io.seekp(sizeof(shangpin)*i,ios::beg);
io.write((char *)&a,sizeof(shangpin));
io.close();
return 0;
}
else 
io.close();
return 0;
}
else continue;
}
cout<<"找不到该商品,请重新输入"<<endl;
io.close();
return 0;
}

就是这两个函数,在调试的时候,一但执行到函数的return 0语句,就提示已停止工作关于一个C++的有关问题,RETURN 0退出不正常
然后就样关于一个C++的有关问题,RETURN 0退出不正常
请教各位大大,这是什么问题啊。。。。。。。执行是没错的,在删除后再查询,确实商品的存在性也被改成了0的

这是我写的增加商品的函数,在这个存入以后,return 0,就没问题.....
int zengjiashangpin()								//增加商品
{
shangpin b(0," ",0,0);
int bianhao2;
string name2;
double jiage2;
int kucun2;
int xuanzhe;
while(1)
{
cout<<"请输入商品的编号:"<<endl;
cin>>bianhao2;
cout<<"请输入商品的名称:"<<endl;
cin>>name2;
cout<<"请输入商品的价格:"<<endl;
cin>>jiage2;
cout<<"请输入商品的进货量:"<<endl;
cin>>kucun2;
cout<<"请确认商品信息,确认请按1,重输请按2"<<endl;
cin>>xuanzhe;
if(xuanzhe==1)
{
b.cunbianhao(bianhao2);
b.cunname(name2);
b.cunjiage(jiage2);
b.cunkucun(kucun2);
cunru(b);
return 0;
}
else
{
system("cls");
continue;
}
}
}
关于一个C++的有关问题,RETURN 0退出不正常

------解决方案--------------------
首先我不知道问题是什么?我给个小建议,你的return值毫无意义,各个分支各种case的return都是0,有什么用意呢?我感觉这个有可能比程序成功运行更重要
------解决方案--------------------
io.read((char *)&a,sizeof(shangpin));

 io.write((char *)&a,sizeof(shangpin));

这个直接把类指针强制转化成 char*,你这样操作相当不规范,更何况你成员变量还有一个
 string name; 这里肯定有问题,你自己实现一个getBuffer的功能,把对象组装成数组buffer.
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。

可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。


ifstream ofstream fstream不都是差不多的东西~~~
不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。
不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~

哦哦好谢谢


其实你单步调试可以在return时,继续单步跳入,如果有你自己写的类或结果体,并且带析构函数,就会跳进析构函数的代码,如果一路走下来都没错,但最后还是崩溃了,那就说明问题出在库函数定义的类或结构体上,因为他们没源码,所以析构函数一旦出错,程序直接崩溃。