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

恐高的长颈鹿 2013-12-19 04:08:53
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语句,就提示已停止工作
然后就样
请教各位大大,这是什么问题啊。。。。。。。执行是没错的,在删除后再查询,确实商品的存在性也被改成了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;
}
}
}
...全文
919 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
看一下堆栈,调用到哪一步挂掉
恐高的长颈鹿 2013-12-20
  • 打赏
  • 举报
回复
引用 20 楼 vipcxj 的回复:
[quote=引用 18 楼 u013215288 的回复:] [quote=引用 15 楼 vipcxj 的回复:] 其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。[/quote] ifstream ofstream fstream不都是差不多的东西~~~ 不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。 不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~[/quote] 谢谢你啊,确实是STRING类的问题,虽然还是懵懵懂懂,不过换成字符数组确实解决了~嘿嘿,谢谢啦
accountsinfo 2013-12-19
  • 打赏
  • 举报
回复
引用 29 楼 u013215288 的回复:
[quote=引用 26 楼 xihu1364 的回复:] 以前编码的时候也用拼音的飘过...
。。。那现在用什么啊。。。[/quote] 切,以前还直接上汉字呢~
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 24 楼 vipcxj 的回复:
你得为写文件专门弄个函数,对于string类型对象,调用c_str()成员函数,就可以得到const char *类型的实际字符串,你把这些字符串写到文件里就行了。同样读取文件时,专门弄个函数,将这些字符串读取后构造个string对象,放入你的结构体就行。其实如果你压根用不到这个string对象,你直接把这个string成员从你的结构体里去掉最省事
哦,我懂了,我去试试,如果不用STRIN类有些输入和赋值不好改了,我试试哈
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 26 楼 xihu1364 的回复:
以前编码的时候也用拼音的飘过...
。。。那现在用什么啊。。。
奔跑的大象 2013-12-19
  • 打赏
  • 举报
回复
1.最简单的办法就是用Debug调试 2.return 之后出现问题,一般情况是释放方法体内占用的内存资源时报错,比如下面的代码 v

bool FuntionTest()
{
   char cBuffer[5];
   strcpy(cBuffer,"Hello");   //加上结束符大小为6 大于cBuffer
   return true;               //释放资源的时候才发现这里溢出了
}
在程序拷贝的过程中是不会出错的,在释放资源的时候才会发现溢出了,也就报错了,
大奶兔白糖 2013-12-19
  • 打赏
  • 举报
回复
引用 26 楼 xihu1364 的回复:
以前编码的时候也用拼音的飘过...
拼音不怕,但是要写对,同时注意大小写还能节约读代码人的时间。以前看过一个代码,里面的表的名字是pingjungongzhi,我对着上下文猜了很久才发现想说的是pingJunGongZi,平均工资
版主大哥 2013-12-19
  • 打赏
  • 举报
回复
以前编码的时候也用拼音的飘过...
vipcxj 2013-12-19
  • 打赏
  • 举报
回复
引用 24 楼 vipcxj 的回复:
你得为写文件专门弄个函数,对于string类型对象,调用c_str()成员函数,就可以得到const char *类型的实际字符串,你把这些字符串写到文件里就行了。同样读取文件时,专门弄个函数,将这些字符串读取后构造个string对象,放入你的结构体就行。其实如果你压根用不到这个string对象,你直接把这个string成员从你的结构体里去掉最省事
引用 24 楼 vipcxj 的回复:
你得为写文件专门弄个函数,对于string类型对象,调用c_str()成员函数,就可以得到const char *类型的实际字符串,你把这些字符串写到文件里就行了。同样读取文件时,专门弄个函数,将这些字符串读取后构造个string对象,放入你的结构体就行。其实如果你压根用不到这个string对象,你直接把这个string成员从你的结构体里去掉最省事
还有个方法,把你结构体里的string成员,改成char name[256],当然这也长度就固定了,name的长度一旦超过256就会出错,确实没string用起来方便,但至少你可以安全的直接写入文件并读取了~
vipcxj 2013-12-19
  • 打赏
  • 举报
回复
你得为写文件专门弄个函数,对于string类型对象,调用c_str()成员函数,就可以得到const char *类型的实际字符串,你把这些字符串写到文件里就行了。同样读取文件时,专门弄个函数,将这些字符串读取后构造个string对象,放入你的结构体就行。其实如果你压根用不到这个string对象,你直接把这个string成员从你的结构体里去掉最省事
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 22 楼 vipcxj 的回复:
[quote=引用 21 楼 u013215288 的回复:] [quote=引用 20 楼 vipcxj 的回复:] [quote=引用 18 楼 u013215288 的回复:] [quote=引用 15 楼 vipcxj 的回复:] 其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。[/quote] ifstream ofstream fstream不都是差不多的东西~~~ 不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。 不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~[/quote] 哦哦好谢谢[/quote] 其实你单步调试可以在return时,继续单步跳入,如果有你自己写的类或结果体,并且带析构函数,就会跳进析构函数的代码,如果一路走下来都没错,但最后还是崩溃了,那就说明问题出在库函数定义的类或结构体上,因为他们没源码,所以析构函数一旦出错,程序直接崩溃。 还有正如LS各位所说,string本身是个蛮复杂的类,你不能将其直接写到文件上再读出来。因为string里面的字符串实际应该是存在一个new出来的char 指针里,你将string写到文件上不会有问题,但读出来放到一个string对象里,就有大问题。分两种情况。 1.之前存有这个指针的string对象已经被销毁,于是指针也被delete,变成无效指针,这是你的新string对象被析构时,会再次delete这个指针,自然要杯具。 2.之前存有这个指针的string对象还没被销毁,于是指针还是有效的。但是一旦你新string对象先于旧对象被析构,那么旧对象存有的指针又失效了,就对象又会发生1出现的问题。 所以无论怎么样,你这样直接从文件读取这个string对象,对会在析构时,也就是退出函数(退出作用域)时杯具。[/quote] 那如果我要读这个string类应该怎么办呢。。。读到一个数组里面吗~
vipcxj 2013-12-19
  • 打赏
  • 举报
回复
引用 21 楼 u013215288 的回复:
[quote=引用 20 楼 vipcxj 的回复:] [quote=引用 18 楼 u013215288 的回复:] [quote=引用 15 楼 vipcxj 的回复:] 其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。[/quote] ifstream ofstream fstream不都是差不多的东西~~~ 不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。 不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~[/quote] 哦哦好谢谢[/quote] 其实你单步调试可以在return时,继续单步跳入,如果有你自己写的类或结果体,并且带析构函数,就会跳进析构函数的代码,如果一路走下来都没错,但最后还是崩溃了,那就说明问题出在库函数定义的类或结构体上,因为他们没源码,所以析构函数一旦出错,程序直接崩溃。 还有正如LS各位所说,string本身是个蛮复杂的类,你不能将其直接写到文件上再读出来。因为string里面的字符串实际应该是存在一个new出来的char 指针里,你将string写到文件上不会有问题,但读出来放到一个string对象里,就有大问题。分两种情况。 1.之前存有这个指针的string对象已经被销毁,于是指针也被delete,变成无效指针,这是你的新string对象被析构时,会再次delete这个指针,自然要杯具。 2.之前存有这个指针的string对象还没被销毁,于是指针还是有效的。但是一旦你新string对象先于旧对象被析构,那么旧对象存有的指针又失效了,就对象又会发生1出现的问题。 所以无论怎么样,你这样直接从文件读取这个string对象,对会在析构时,也就是退出函数(退出作用域)时杯具。
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 20 楼 vipcxj 的回复:
[quote=引用 18 楼 u013215288 的回复:] [quote=引用 15 楼 vipcxj 的回复:] 其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。[/quote] ifstream ofstream fstream不都是差不多的东西~~~ 不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。 不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~[/quote] 哦哦好谢谢
vipcxj 2013-12-19
  • 打赏
  • 举报
回复
引用 18 楼 u013215288 的回复:
[quote=引用 15 楼 vipcxj 的回复:] 其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。[/quote] ifstream ofstream fstream不都是差不多的东西~~~ 不过我确实不能肯定你的问题和close有关,一般来说手动close不会出什么问题。 不我有一点我是确定滴,如果你通过单步调试发现程序在退出函数时崩溃,一定是哪个对象的析构函数出了问题。可能不是i/ofstream,而是别的什么你自己创建的对象,你一个一个查就是了~
大奶兔白糖 2013-12-19
  • 打赏
  • 举报
回复
引用 16 楼 u013215288 的回复:
[quote=引用 13 楼 bijiaoben 的回复:] 楼主的存入是把shangpin对象一下子全写文件里了,然后读出来的时候又一下子都读出来,对象里面的string类型的成员变量要怎么办?楼主可以先看一下string类的定义
string类这个怎么看啊,还没学呢,额,请教一下。。。名字定义的格式应该是怎么样的……这些都还没学呢、、、[/quote] http://baike.baidu.com/link?url=8_DF_JWq2DB00bN0ngX7DpDJJaDMwmfbp33bPVKhSCYbgXW8umt9oQLalpvoa_lbNLkAfxF91K400CZp0t4NEa
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 15 楼 vipcxj 的回复:
其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
可是我只用了一次fstream啊,在查询函数那我只用了ifstream啊。。。。。也出错呢。。
mujiok2003 2013-12-19
  • 打赏
  • 举报
回复
调戏一下。
恐高的长颈鹿 2013-12-19
  • 打赏
  • 举报
回复
引用 13 楼 bijiaoben 的回复:
楼主的存入是把shangpin对象一下子全写文件里了,然后读出来的时候又一下子都读出来,对象里面的string类型的成员变量要怎么办?楼主可以先看一下string类的定义
string类这个怎么看啊,还没学呢,额,请教一下。。。名字定义的格式应该是怎么样的……这些都还没学呢、、、
vipcxj 2013-12-19
  • 打赏
  • 举报
回复
其实你的文件操作不规范,fstream其实不需要你手动close的,它会在析构函数中自行close。我不确定是不是因为你乱用close导致的错误,我凭我的经验,你的错误和return毫无关联,你的错误应该是由于退出函数时,某个对象的析构函数释放资源出错导致。而最有可能的对象就是这一堆fstream。
大奶兔白糖 2013-12-19
  • 打赏
  • 举报
回复
另外,楼主这拼音加英文,全都是小写,看得我眼快花了
加载更多回复(13)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧