📄 del.h
字号:
//文件del.h(删除职工记录函数del()的实现。
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<iomanip>
#include"str.h"
using namespace std;
/***********************************************
删除职工记录的时候,以职工编号为主键,且数据文件
中必须存在该职工记录。先验证用户输入的职工编号是
否符合条件(必须只含数字),再将职工记录全部读入
内存,匹配编号,计数器记下编号,在内存中替换数据,
最后将最新的记录写入数据文件,删除完毕。
***********************************************/
void del()
{
for( ; ; )
{ int have=0; //记录编号的匹配数。
char back='1'; //询问用户是否返回。
int num_in; //用户输入的编号。
char num_in_char[20];
int back_out=1; //判断是否退出这个for循环回到主菜单。
int max_Current; //记录当前的职工最大数。
/***********从数据文件max.dat中得知当前的职工最大数是多少*********/
int max;
ifstream fcin("max.dat");
if(fcin.fail()) //判断文件max.dat是否成功打开。
{
cout<<"文件max.dat打开失败,程序将结束"<<endl;
exit(1);
}
fcin>>max; //从数据文件max.dat得到职工的最大数。
fcin.close(); //关闭文件max.dat。
/**********************从数据文件中读取职工的信息*****************/
struct _Employee //_Employee结构的定义。
{
int num;
string name;
string sex;
int age;
int wage; //工资
};
_Employee *employee=new _Employee[max]; //定义动态结构体数组。
ifstream fin("name.dat"); //定义一个输入流对象,用于读取文件的记录。
if(fin.fail())
{
cout<<"文件name.dat打开失败,程序将结束"<<endl;
exit(1);
}
/******这个while循环是很容易出错的,注意*****/
int i=0;
while(!fin.eof()) //文件末尾检查,如果文件读取没结束,返回0。
{
fin>>employee[i].num>>employee[i].name>>employee[i].sex
>>employee[i].age>>employee[i].wage;
i++;
}
max_Current=i; //记录当前的职工最大数。
//cout<<"max="<<max<<endl; //测试当前职工最大数是多少。
fin.close(); //关闭文件name.dat。
/**********************从数据文件中读取职工的信息完毕*****************/
for( ; ; ) //删除职工信息的循环。
{
bool temp_bool=false; //判断用户输入是否合法的变量。
cout<<"**************开始删除职工信息****************"<<endl;
cout<<"请输入想要删除的职工编号("<<max+1<<"-"<<max*2<<"):";
cin>>num_in_char;
temp_bool=check(num_in_char);
while(!temp_bool)
{
cout<<"对不起,您的输入带有非法字符!请重新输入:";
cin>>num_in_char;
temp_bool=check(num_in_char);
}
num_in=atoi(num_in_char); //
while(have==0)
{
for(i=0;i<max_Current;i++) //将用户输入的编号原始的职工记录匹配。
{
if(employee[i].num!=num_in)
;
else
{
have+=1;
num_in=i;
break;
}
}
if(have==0) //判断想要删除的职工信息是否存在。
{
cout<<"对不起,您想要删除的这个职工不存在或者该职工信息已经被删除!"<<endl;
cout<<"返回主菜单请按1,重新输入请按2:";
cin>>back;
while(back!='1' && back!='2')
{
cout<<"对不起,您输入的只能是1或2!"<<endl;
cout<<"返回主菜单请按1,重新输入请按2:";
cin>>back;
}
if(back=='1')
{
back='0';
back_out=0;
break; //退出while循环,回到外层的for循环。
}
cout<<"请输入想要删除的职工编号("<<max+1<<"-"<<max*2<<"):";
cin>>num_in_char;
temp_bool=check(num_in_char);
while(!temp_bool)
{
cout<<"对不起,您的输入带有非法字符!请重新输入:";
cin>>num_in_char;
temp_bool=check(num_in_char);
}
num_in=atoi(num_in_char); //
continue;
}
else
if(have==1)
break; // 跳出while循环。
} //匹配循环while循环j结束。
if(back_out==0)
break;
//询问用户是否真的要删除职工信息。
char select; //用户再次选择自己的操作。
cout<<"是否要删除"<<employee[i].num<<"号职工的信息?"<<endl;
cout<<"确认删除请按1,否则回到主菜单请按0:";
cin>>select;
while(select!='1' &&select!='0')
{
cout<<"对不起,您输入的只能是1或0!"<<endl;
cout<<"是否要删除"<<employee[i].num<<"号职工的信息?"<<endl;
cout<<"确认删除请按1,回到主菜单请按0:";
cin>>select;
}
if(select=='1')
;
else
{
back='0';
back_out=0;
}
if(back=='0') //判断是否跳出内层for循环,停止删除职工信息。
break; // 停止删除职工信息。
/***************************开始执行删除操作**********************************/
have=0; //记录是否匹配变量归0.
if(max_Current==1) //若只剩下一个职工信息。
{
cout<<"*******对不起,原始职工信息不能为空!*************"<<endl;
back='0';
back_out=0;
break;
}
for(i=num_in;i<max_Current;i++) //若职工信息记录数大于1,开始删除。
{
employee[i].num=employee[i+1].num;
employee[i].name=employee[i+1].name;
employee[i].sex=employee[i+1].sex;
employee[i].age=employee[i+1].age;
employee[i].wage=employee[i+1].wage;
}
max_Current--; //当前最大职工数减1.
ofstream fout("name.dat"); //定义一个输出流对象。
if(fout.fail())
{
cout<<"文件name.dat打开失败,程序将结束"<<endl;
exit(1);
}
//把职工记录写入文件。
fout<<employee[0].num<<" "<<employee[0].name<<" "
<<employee[0].sex<<" "<<employee[0].age<<" "
<<employee[0].wage;
for(i=1;i<max_Current;i++)
fout<<endl<<employee[i].num<<" "<<employee[i].name<<" "
<<employee[i].sex<<" "<<employee[i].age<<" "
<<employee[i].wage;
cout<<"职工信息删除成功,继续删除请按1,返回主菜单请按0." ; //询问用户是否继续删除信息。
cout<<"请输入:";
cin>>back;
while(back!='0' && back!='1')
{
cout<<"您的输入有误,请重新输入!"<<endl;
cout<<"职工信息删除成功,继续删除请按1,返回主菜单请按0." ;
cout<<"请输入:";
cin>>back;
}
/****************************删除职工信息结束*********************************/
if(back=='0') //一次信息删除后接受消息,执行继续或退出删除操作。
{
back_out=0; //用户决定停止删除职工信息的同时,准备退出该菜单。
fout.close(); //关闭输出流对象。
break;
}
} //删除职工信息for循环结束。
if(back_out==0)
break; //退出外层for循环,回到主菜单。
} //外层for循环结束。
} //del函数结束。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -