?? 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 + -