#include <iostream.h>
#include <fstream>
#include <string.h>
#include <sstream>
using namespace std;
//定義文件名
#define FileName "data.txt"
//定義循環變量
bool mVal=true;
//定義個新的變量
typedef string mData;
typedef char mChar[50];
//定義一個CrmCperson結構體
typedef struct CrmCperson
{
struct CrmCperson *lplink;
string mName;
string mpNumber;
string mhAddress;
string mhZip;
}msData;
msData *Data;
class Crm
{
public:
Crm();
AddData(mData mName,mData mpNumber,mData mhAddress,mData mhZip ); //添加用戶
FindData(mData mName);
RevData(mData mName);
DelData(mData mName);
myWhile();
ShowData();
~Crm();
};
class CrmFile
{
public:
CrmFile();
GetData();
SavaData(msData& mymsData);
UpDateData(void);
~CrmFile();
};
CrmFile::CrmFile()
{}
CrmFile::GetData()
{
msData *mymsData=new msData;
//msData *myothermsData=new msData; 放這裏會出錯,放下面
Data=mymsData; //保存基址指針
fstream myfile(FileName);
string str[4];
while(!myfile.eof()){
for(int j=0;j<4;j++){
getline(myfile,str[j]);
}
msData *myothermsData=new msData; //這裏是關鍵位置,不然地址不能更新,會出錯
mymsData->mName=str[0];
mymsData->mpNumber=str[1];
mymsData->mhAddress=str[2];
mymsData->mhZip=str[3];
mymsData->lplink=myothermsData;
mymsData=myothermsData;
}
mymsData->lplink=NULL; //設置鏈表尾爲NULL
myfile.close();
}
CrmFile::SavaData(msData& mymsData) //保存數據到文件
{
fstream myfile;
myfile.open(FileName,ios_base::out|ios_base::app); //以追加方式打開文件
myfile<<mymsData.mName<<endl;
myfile<<mymsData.mpNumber<<endl;
myfile<<mymsData.mhAddress<<endl;
myfile<<mymsData.mhZip<<endl;
myfile.close();
}
CrmFile::UpDateData(void) //更新到文件
{
msData *mymsData=new msData;
mymsData=Data; //基址指針
fstream myfile;
myfile.open(FileName,ios_base::out); //打開文件
while(mymsData!=NULL){ //更新數據
myfile<<mymsData->mName<<endl;
myfile<<mymsData->mpNumber<<endl;
myfile<<mymsData->mhAddress<<endl;
myfile<<mymsData->mhZip<<endl;
mymsData=mymsData->lplink;
}
myfile.close();
}
CrmFile::~CrmFile()
{}
Crm::Crm()
{}
Crm::AddData(mData mName,mData mpNumber,mData mhAddress,mData mhZip ) //添加用戶
{
msData mymsData;
mymsData.mName=mName;
mymsData.mpNumber=mpNumber;
mymsData.mhAddress=mhAddress;
mymsData.mhZip=mhZip;
CrmFile myCrmFile;
myCrmFile.SavaData(mymsData); //調用CrmFile類中的SavaData函數保存數據
}
Crm::FindData(mData mName) //查找用戶
{
CrmFile myCrmFile;
myCrmFile.GetData(); //讀取文件內容到鏈表
msData *mymsData=new msData;
mymsData=Data; //基址指針
while(mymsData!=NULL){
if(mName==mymsData->mName){
cout<<"姓名"<<" ";
cout<<"聯繫號碼"<<" ";
cout<<"聯繫地址"<<" ";
cout<<"郵編"<<endl;
cout<<mymsData->mName.c_str()<<" ";
cout<<mymsData->mpNumber.c_str()<<" ";
cout<<mymsData->mhAddress.c_str()<<" ";
cout<<mymsData->mhZip.c_str()<<endl;
break;
}
mymsData=mymsData->lplink;
}
}
Crm::RevData(mData mName)
{
CrmFile myCrmFile;
myCrmFile.GetData(); //讀取文件內容到鏈表
msData *mymsData=new msData;
mymsData=Data; //基址指針
mChar mystr[3];
while(mymsData!=NULL){
if(mymsData->mName==mName){ //判斷在鏈表的位置
mymsData->mName=mName;
cin>>mystr[0];
mymsData->mpNumber=mystr[0];
cin>>mystr[1];
mymsData->mhAddress=mystr[1];
cin>>mystr[2];
mymsData->mhZip=mystr[2];
myCrmFile.UpDateData(); //調用更新數據到文件
cout<<"修改成功"<<endl;
return 0;
}
mymsData=mymsData->lplink;
}
cout<<"修改失敗,用戶不存在!"<<endl;
}
Crm::DelData(mData mName)
{
CrmFile myCrmFile;
myCrmFile.GetData(); //讀取文件內容到鏈表
msData *mymsData=new msData;
msData *myotherData=new msData;
mymsData=Data; //基址指針
while(mymsData!=NULL){
if(mymsData->mName==mName){ //判斷在鏈表的位置
if(mymsData==Data){
Data=mymsData->lplink;
}else{
myotherData->lplink=mymsData->lplink; //刪除節點
}
myCrmFile.UpDateData(); //調用更新數據到文件
cout<<"刪除成功"<<endl;
return 0;
}
myotherData=mymsData;
mymsData=mymsData->lplink;
}
cout<<"刪除失敗,用戶不存在!"<<endl;
}
Crm::myWhile() //判斷是否繼續循環輸入
{
cout<<"繼續y,任意退出"<<endl;
if(getchar()=='y'){
mVal=true;
}else{
mVal=false;
}
getchar(); //取回車
}
Crm::ShowData()
{
CrmFile myCrmFile;
myCrmFile.GetData();
msData *mymsData=new msData;
mymsData=Data; //基地指針
cout<<"姓名";
cout<<" ";
cout<<"電話號碼";
cout<<" ";
cout<<"聯繫地址";
cout<<" ";
cout<<"郵編";
cout<<endl;
//編歷鏈表顯示數據
while(mymsData!=NULL){
cout<<mymsData->mName.c_str();
cout<<" ";
cout<<mymsData->mpNumber.c_str();
cout<<" ";
cout<<mymsData->mhAddress.c_str();
cout<<" ";
cout<<mymsData->mhZip.c_str();
cout<<endl;
mymsData=mymsData->lplink;
}
}
Crm::~Crm()
{}
int main()
{
cout<<"Communications Recorded Management(通訊錄管理程序)"<<endl;
cout<<"**************************************************"<<endl;
cout<<"1)添加用戶 2)查找用戶 3)修改記錄 "<<endl;
cout<<"4)刪除記錄 5)顯示記錄 6)裝入數據 "<<endl;
cout<<"**************************************************"<<endl;
Crm myCrm;
CrmFile myCrmFile;
while(mVal){ //循環重複輸入
cout<<"輸入序號:(1~6)"<<endl;
int x;
cin>>x;
switch(x){
case 1:{
cout<<"添加用戶"<<endl;
cout<<"格式:姓名(回車)聯繫號碼(回車)聯繫地址(回車)郵編"<<endl;
mChar mymChar[4];
for(int i=0;i<4;i++){
cin>>mymChar[i];
}
myCrm.AddData(mymChar[0],mymChar[1],mymChar[2],mymChar[3]);
myCrm.myWhile();
break;
}
case 2:{
cout<<"查找用戶,請輸入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.FindData(mymChar);
myCrm.myWhile();
break;
}
case 3:{
cout<<"修改記錄,請輸入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.RevData(mymChar);
myCrm.myWhile();
break;
}
case 4:{
cout<<"刪除記錄,請輸入姓名:"<<endl;
mChar mymChar;
cin>>mymChar;
myCrm.DelData(mymChar);
myCrm.myWhile();
break;
}
case 5:{
cout<<"顯示記錄"<<endl;
myCrm.ShowData();
myCrm.myWhile();
break;
}
case 6:{
cout<<"裝入數據"<<endl;
myCrmFile.GetData();
myCrm.myWhile();
cout<<"裝入數據成功!"<<endl;
break;
}
default:{
cout<<"輸入不正確(1~6)"<<endl;
myCrm.myWhile();
break;
}
}
}
cout<<"成功退出!感謝使用!再見!"<<endl;
return 0;
}