有一段代码老是出现无限循环,帮忙看一下

eks_222 2008-06-19 02:32:44
void Delete(fstream f)
{
int choice8; //用于询问是否要继续删除文件
do
{
AnsSys question;
int k=1; //显示问题的序号
int choice7;
f.seekp(0,ios::beg);
long posEnd=f.tellp();
f.seekp(0,ios::beg);
do //把问题显示出来,方便用户选择要删除哪一个问题
{
f.read((char*)(&question),sizeof(AnsSys));
cout<<k++<<"."<<question.Ques<<endl;
}while(f.tellp()!=posEnd);
AnsSys *temp=new AnsSys[k] ; //建立一个数组,用于从磁盘文件中导出所有的问题
f.seekp(0,ios::beg);
int i=0;
do
{
f.read((char*)(&question),sizeof(AnsSys));
temp[i]=question; //从磁盘文件中导出所有问题
i++;
}while(f.tellp()!=posEnd);
cout<<"请输入您所要删除的问题的序号"<<endl;
while(cin>>choice7) //接收并判断所要删除的问题序号
{
if(choice7<k||choice7>0)
break;
else
cout<<"输入错误,请重新输入"<<endl;
}
for(int j=choice7-1;j<k-1;j++) //后一个问题覆盖前一个,也就是删除
{
temp[j]=temp[j+1];
}
FILE *fp=fopen("d:\\hello.bat","w"); //关闭在重新打开,清空文件中保存的数据
fclose(fp);
f.seekp(0,ios::beg);
int l=0;
do //把覆盖好的数组写入文件
{
f.write((char *)(&temp[l]),sizeof(AnsSys));
l++;
}while(l!=k-2);
cout<<"删除完毕,按y选择继续删除,按任意健退出"<<endl;
cin>>choice8;
}while(choice8!='y'||choice8!='Y');
return;
}
...全文
185 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
长安宁 2008-06-19
  • 打赏
  • 举报
回复
错了,是

int l=0;
do //把覆盖好的数组写入文件
{
f.write((char *)(&temp[l]),sizeof(AnsSys));
l++;
}while(l!=k-2);
如果这个时候,k<3,就陷入死循环了
长安宁 2008-06-19
  • 打赏
  • 举报
回复

int k=1;
do //把问题显示出来,方便用户选择要删除哪一个问题
{
f.read((char*)(&question),sizeof(AnsSys));
cout<<k++<<"."<<question.Ques<<endl;
}while(f.tellp()!=posEnd);
这句执行完了,k是>=2的;



int l=0;
do //把覆盖好的数组写入文件
{
f.write((char *)(&temp[l]),sizeof(AnsSys));
l++;
}while(l!=k-2);
如果这个时候,k<=3,就陷入死循环了
qhfu 2008-06-19
  • 打赏
  • 举报
回复
if(choice7<k||choice7>0)
=========
这句话也有问题?
51365133 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xuexsong 的回复:]
引用 4 楼 coverallwangp 的回复:
引用 3 楼 foxhill 的回复:
引用 1 楼 brookmill 的回复:
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&

choice8不可能同时等于两个值,LZ while的条件无论在什么情况下都是成立的,所以不可能退出最终导致死循环,1楼正解。


是啊,楼主的代码只有在choice8同时等于y和Y时,才会终止循环。
[/Quote]
BIGBIRDINWOODS 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&
[/Quote]
kuku0122 2008-06-19
  • 打赏
  • 举报
回复
while(choice8=='y' ¦ ¦choice8=='Y');
kuku0122 2008-06-19
  • 打赏
  • 举报
回复
改成
while(choice8='y'||choice8='Y');
不是更容易理解么
xuexsong 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 coverallwangp 的回复:]
引用 3 楼 foxhill 的回复:
引用 1 楼 brookmill 的回复:
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&

choice8不可能同时等于两个值,LZ while的条件无论在什么情况下都是成立的,所以不可能退出最终导致死循环,1楼正解。
[/Quote]

是啊,楼主的代码只有在choice8同时等于y和Y时,才会终止循环。
Eleven 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 coverallwangp 的回复:]
引用 3 楼 foxhill 的回复:
引用 1 楼 brookmill 的回复:
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&

choice8不可能同时等于两个值,LZ while的条件无论在什么情况下都是成立的,所以不可能退出最终导致死循环,1楼正解。
[/Quote]
coverallwangp 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 foxhill 的回复:]
引用 1 楼 brookmill 的回复:
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&

choice8不可能同时等于两个值,LZ while的条件无论在什么情况下都是成立的,所以不可能退出最终导致死循环,1楼正解。
[/Quote]
foxhill 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 brookmill 的回复:]
}while(choice8!='y' ¦ ¦choice8!='Y');
改成&&
[/Quote]
choice8不可能同时等于两个值,LZ while的条件无论在什么情况下都是成立的,所以不可能退出最终导致死循环,1楼正解。
eks_222 2008-06-19
  • 打赏
  • 举报
回复
那个动态存储有问题吗?
我加了
delete []temp;
temp=NULL;
之后还是不行
eks_222 2008-06-19
  • 打赏
  • 举报
回复
       AnsSys question;
int k=1; //显示问题的序号
int choice7;
f.seekp(0,ios::beg);
long posEnd=f.tellp();
f.seekp(0,ios::beg);

原来是这里的问题啊
哈哈哈
麻烦了大家添
把文件开头的指针当成是文件结束的指针
怎么能够不无限循环呢!!!
哈哈
小弟会改了粗心的坏习惯......
应该是
      AnsSys question;
int k=1; //显示问题的序号
int choice7;
f.seekp(0,ios::end);//改了这里
long posEnd=f.tellp();
f.seekp(0,ios::beg);

不过现在好像是另外一个循环有问题
它会一直删除,知道只剩下最后一个元素为止
又要奋战
现在的代码是这样的
void Delete(fstream f)
{
int choice8; //用于询问是否要继续删除文件
do
{
AnsSys question;
int k=1; //显示问题的序号
int choice7;
f.seekp(0,ios::end);
long posEnd=f.tellp();
f.seekp(0,ios::beg);
do //把问题显示出来,方便用户选择要删除哪一个问题
{
f.read((char*)(&question),sizeof(AnsSys));
cout<<k++<<"."<<question.Ques<<endl;
cout<<"a"<<endl;
}while(f.tellp()!=posEnd);
AnsSys *temp=new AnsSys[k] ; //建立一个数组,用于从磁盘文件中导出所有的问题
f.seekp(0,ios::beg);
int i=0;
do
{
f.read((char*)(&question),sizeof(AnsSys));
temp[i]=question; //从磁盘文件中导出所有问题
i++;
}while(f.tellp()!=posEnd);
cout<<"请输入您所要删除的问题的序号"<<endl;
while(cin>>choice7) //接收并判断所要删除的问题序号
{
if(choice7<k||choice7>0)
break;
else
cout<<"输入错误,请重新输入"<<endl;
}
for(int j=choice7-1;j<k-1;j++) //后一个问题覆盖前一个,也就是删除
{
temp[j]=temp[j+1];
}
FILE *fp=fopen("d:\\hello.bat","w"); //关闭在重新打开,清空文件中保存的数据
fclose(fp);
f.seekp(0,ios::beg);
int l=0;
do //把覆盖好的数组写入文件
{
f.write((char *)(&temp[l]),sizeof(AnsSys));
l++;
}while(l!=k-2);
cout<<"删除完毕,按y选择继续删除,按任意健退出"<<endl;
cin>>choice8;
}while(choice8!='y'&&choice8!='Y');
return;
}

努力啊~~~~~~~~~~~
eks_222 2008-06-19
  • 打赏
  • 举报
回复
原来有这么多问题啊 .......
不过K>3的
改了之后问题还是那样
程序会用所保存的文件中的最后一个元素覆盖所有的元素,然后再无限地复制,好像是调用下面这段代码显示出来
do                                                          //把问题显示出来,方便用户选择要删除哪一个问题
{
f.read((char*)(&question),sizeof(AnsSys));
cout<<k++<<"."<<question.Ques<<endl;
}while(f.tellp()!=posEnd);
brookmill 2008-06-19
  • 打赏
  • 举报
回复
......
char choice8;
......
cout<<"删除完毕,按y选择继续删除,按任意健退出"<<endl;
cin>>choice8;
}while(choice8=='y'||choice8=='Y');
return;
}
brookmill 2008-06-19
  • 打赏
  • 举报
回复
}while(choice8!='y'||choice8!='Y');
改成&&

64,654

社区成员

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

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