之前在那个程序中有输入,有排序,有统计,但是我们要删除其中的一条记录,如何删除呢?今天刚写的代码,包含了注释,自己看看吧~
while(chose==3)
{
int tempcount=0;
ifstream infile("data.txt"); //绑定文件
string arr[1000];
string del_str;
string _str;
infile>>_str;
if(_str.empty())
{
cout<<"无数据!程序即将退出!"<<endl;
break;
}
cout<<_str<<endl;//数据读入成功!
cout<<"请输入你要删除的职工号"<<endl;
cin>>del_str;
del_str+="&";
string::iterator p=_str.begin();
string::iterator first=p; //记住当前p所指向的字符串(str的首字符)
string::iterator last=p; //用于尾部的指针
int ix=0;
while(*p!=NULL)
{
string tempstr; //临时str存放的是当前指向的属性,与del_str进行比较
arr[ix]=*p;//
++p; //将数据存进数组
++ix; ///
if(*p=='$')
{
++tempcount;
++p;
for(int i=1;i<ix;i++)
{
arr[0]+=arr[i];
}
tempstr=arr[0];
cout<<tempstr<<endl;
if(tempstr==del_str)//如果当前的临时变量等于需要删除的变量
{
tempcount=1; //每次找到匹配头的时候就将计数器重新置为1 因为找到了职工号,所以$已经有了1个,所以置为1而不是0
while(*p!='$'||tempcount!=6) //只要我们的$符号不为6,或者我们的*p还不为$,我们就继续执行循环体中的语句。
{
++p; //一上来我们就要把指针p加一,这样我们就能够计算$符号的个数,来决定我们这个职工的所有属性到底指完了没。(☆_☆)/~~
if(*p=='$')
{
++tempcount;
}
}
last=p; //最后,我们将last指针变为P当前所指的数据,这样我们就完成了first和last指针的正确数据指向!
p=_str.erase(first,last+1);//调用string类型的函数来删除两个指针中间的值,+1是为了删除最后一个$。↖(^ω^)↗
}
ix=0;
first=p; //在这里我们将first的指针指向P,否则会产生指针永远指向头的情况,会造成只能顺序删除而不能随机删除的情况,
} //这个情况debug了我一个小时,把first指针给忘了……细心很重要啊!(ー_ー)!!
}
ofstream("data.txt").close(); //清空原数据
ofile.open("data.txt",ofstream::out | ofstream::app); //重新打开文件
ofile<<_str; //将_str中的内容全部写入文件,这样做效率太低,不过我暂时没什么好办法,希望大神能给出更完美的算法,谢谢!
chose=0; //给予跳出循环的条件,完成~!`(*∩_∩*)′
}
}
企业管理程序数据删除代码
最新推荐文章于 2019-05-07 00:17:27 发布