通讯录管理系统(结构体)



//已经有了文件连续编号功能,删除某行的时候的编号修改功能进行中。
#include <stdio.h>
#include<stdlib.h>
#include <iostream>
#include <fstream>//输出流的头文件
#include <sstream>//对字符串的输入/输出流操作的头文件;
#include <string>
#include <algorithm>
#include<string.h>
using namespace std;
#define FILENAME "E:\\phonebook.txt"
#define TEMP "E:\\phonebook.麻伶毅"
///////////////////////////////
struct Record{
public:
 int sequence_number;//序号
 string name;
 string number;
 string sex;
 string age;
 string tel;
 string email;
 string address;
};
static int iCount_Number=0; //定义静态变量用于编号,
///////////////////////////////
//////全局变量/////////////////
char _name[10];//姓名
char _char1[256];//char暂存 全局变量
///////////////////////////////

void run(int opt);//运行

void list_record();//列出所有记录||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||功能函数1||||||||
void new_record();//添加新记录|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||功能函数2||||||||
bool search_record(string name);//搜索记录并显示,匹配到则返回ture否则false||||||||||||||||||||||||||||||功能函数3||||||||
void delete_record(string name);//删除指定记录行|||||||||||||||||||||||||||||||||||||||||||||||||||||||||功能函数4||||||||
void change_record(string name);//修改记录|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||功能函数5||||||||

int Set_sequence_number(Record rec);//设置序号,按照升序的方式排列
void Change_sequence_number();//当进行删除操作后,对后续的序列做向后减一操作;//由于对文件的操作的部分修改还不会,此处先不写
void add_record(Record );//写入新记录
Record input_rec();//输入记录
char* getname(string s);//获取姓名
char* string_to_char(string s);//将string型的name变为char[10]
bool cmpstr(char *s1,char *s2);//比较char[10]是否相同
void re_store();//回储函数,将temp中的内容回储到文件
bool pre_search_record(string name);//预查找,匹配到则返回ture否则false
void init();//程序初始化
void clean_gloabal_var(int var);//清空全局变量

/////////////////////////////////////////////////////////
/////mainmainmainmainmainmainmainmainmainmainmainmain////
/////mainmainmainmainmainmainmainmainmainmainmainmain////
int main(){
 init();
 char i;//为了节省空间
loop:
 cout<<"  欢迎使用通讯录系统"<<endl;
 cout<<"====================================================="<<endl;
 cout<<"1.查看所有联系人 2.查找联系人 3.添加联系人"<<endl;
 cout<<"4.删除联系人  5.修改联系人 6.关闭软件"<<endl;
 cout<<"====================================================="<<endl;
 cout<<"请选择:";

 cin>>i;
 i=i-48;//i是字符型,所以-48表示它的整型
 run(i);
 system("pause");
 system("cls");
 if (i!=6)
 {
  goto loop;
 }
 return 0;
}
/////mainmainmainmainmainmainmainmainmainmainmainmain////
/////mainmainmainmainmainmainmainmainmainmainmainmain////
/////////////////////////////////////////////////////////

void run(int opt)//运行函数
{
 switch (opt)
 {
 case 1:
  {
   list_record();
   break;
  }
 case 2:
  {
   cout<<"请输入要搜索的姓名:";
   string s;
   cin>>s;
   if(!search_record(s))
    cout<<"查无记录!"<<endl;
   break;
  }
 case 3:
  {
   new_record();
   break;
  }
  
 case 4:
  {
   cout<<"请输入要删除的姓名:";
   string s;
   cin>>s;
   delete_record(s);
   break;
  }
  
 case 5:
  {
   cout<<"请输入要修改的姓名:";
   string s;
   cin>>s;
   change_record(s);
   break;
  }
 case 6:
  {
   //退出
   char cmd[50]="del ";
   strcat(cmd,TEMP);
   system(cmd);//删除缓存文件
   break;
  }
 default:
  ;
 }
}
////////////////////////////////////////////////////////

int Set_sequence_number(Record rec){
  ifstream file(FILENAME);
  string str;   
  int count = 0;   
  while(file) {       
   getline(file, str);//从文件中读取一行       
   remove(str.begin(),str.end(),' ');//这个算法函数在algorithm头文件中,删除一行中的空格       
   remove(str.begin(),str.end(),'\t');//删除一行中的制表符,因为制表符和空格都是空的       
   if (str.length()>0) {//如果删除制表符和空格之后的一行数据还有其他字符就算有效行           
    count ++;       
   }
  }
   file.close();

    //iCount_Number++;
    rec.sequence_number=count+1;
 return rec.sequence_number;
}
void Change_sequence_number(){
    ;
}

void new_record(){
 Record rec=input_rec();//创建时将输入的新记录复制;
 add_record(rec);//将新记录添加到文件当中
}

Record input_rec(){//输入新记录
 string name,sex,tel,number,age,email,address;
 cout<<"请输入记录:"<<endl;
 cout<<"姓名:";
 cin>>name;
loop:
 if(pre_search_record(name)){//判断是否联系人已经存在
    cout<<"此人信息已存在,请选择:1、重新输入   2、修改此人记录  3、返回主菜单选择"<<endl;
    char i;
    cin>>i;
    switch(i){
      case '1':
    cout<<"请输入记录:"<<endl;
          cout<<"姓名:";
          cin>>name;
    if(pre_search_record(name))//判断是否还是存在
     goto loop;
          break;
   case '2':change_record(name);break;
   case '3':main();break;
   default: cout<<"输入不符合,退出";exit(0);break;
    }
 }
   cout<<"学号:";
   cin>>number;
   cout<<"性别:";
   cin>>sex;
   cout<<"年龄:";
   cin>>age;
   cout<<"电话:";
   cin>>tel;
   cout<<"邮箱:";
   cin>>email;
   cout<<"地址:";
   cin>>address;
 ////////////////////
 Record rec;
 rec.sequence_number=Set_sequence_number(rec);
 rec.name=name;
 rec.number=number;
 rec.sex=sex;
 rec.age=age;
 rec.address=address;
 rec.email=email;
 rec.tel=tel;
 ////////////////////
 return rec;
}

void add_record(Record rec){//写入新记录
 ////处理结构体//////
 int sequence_number=rec.sequence_number;
 string name=rec.name;
 string sex=rec.sex;
 string tel=rec.tel;
 string number=rec.number;
 string age=rec.age;
 string address=rec.address;
 string email=rec.email;
 ////////////////////
 ofstream fout;
 fout.open(FILENAME,ios::app);//文件不存在时会主动创建
 if (fout.fail())
 {
  cerr<<"open file with write error"<<endl;
 }
 fout<<name<<"  "<<sequence_number<<"  "<<number<<"   "<<sex<<"   "<<age<<"   "<<tel<<"   "<<email<<"   "<<address<<endl;
 fout.close();
}


void list_record(){
 //read from file
 ifstream fin(FILENAME);
 if (fin.fail())
 {
  cerr << "open file with read error" << endl;
  _exit(-127);
 }
 //////////////////////////
 string s;//存储返回的字符串,即一行的内容

 //fin.seekg(20,ios::cur);//当前位置往文件尾移动20字符
 cout<<"====================================================="<<endl;
 cout<<"姓名   编号    学号       性别  年龄       电话        邮箱            地址"<<endl;
 while(getline(fin,s))//取文件中一行的内容显示
 {
  //cout<<s.length()<<endl;
  cout<<s<<endl;
 }
 cout<<"====================================================="<<endl;
 fin.close();

}
/////////////////////////////////////////////////
bool search_record(string name){
 ifstream book(FILENAME);//读取文件
 if (book.fail())//打开文件失败,则
 {
  cerr << "open file with read error" << endl;//错误消息可以直接发送到显示器,而无需等到缓冲区或者新的换行符时,才被显示。而cout则需要先到缓冲区或者到新的换行符
  _exit(-127);
 }
 string s=" ";//初始化,string类型的字符串有16个字节的大小
 cout<<"====================================================="<<endl;
 while(getline(book,s))// 逐行读取,存入字符串s当中,行与行之间用换行符隔开
 {
  //////将获取的行中的相关内容提取////////
  //if (*(getname(s))==*(string_to_char(name)))比较字符串应该用strcmp//但是却不能比较char型,只能const char
  clean_gloabal_var(1);//清空第一个全局变量name[]
  clean_gloabal_var(2);//清空第二个全局变量char1[]
  getname(s);//获取每条记录(行)中的姓名
  string_to_char(name);//将string型的name编程char型的,便于下面用cmpstr比较
  if (cmpstr(_name,_char1))//比较字符串,所查找的名字是否在文件中能找到匹配;
  {
   cout<<s<<endl;
   //break;
  }
  ////////////////////////////////////////
 }
 cout<<"====================================================="<<endl;
 bool rst;
 if (s==" ")//说明读取失败;
 {
  rst=false;
 }
 else{
  rst=true;
 }
 if (!rst)
 {
  cout<<"查无记录"<<endl;
 }
 book.close();
 return rst;
}
/////////////////////////////////////////////////
bool pre_search_record(string name){//预查找
 ifstream book(FILENAME);
 if (book.fail())
 {
  cerr << "open file with read error" << endl;
  _exit(-127);
 }
 string s="";
 while(getline(book,s))
 {
  //////将获取的行中的相关内容提取////////
  clean_gloabal_var(1);
  clean_gloabal_var(2);
  getname(s);
  string_to_char(name);
  if (cmpstr(_name,_char1))
  {
   break;
  }
  ////////////////////////////////////////
 }
 bool rst;
 if (s=="")
 {
  rst=false;
 }
 else{
  rst=true;
 }
 book.close();
 return rst;

}
/////////////////////////////////////////////////
void delete_record(string name){//删除指定记录行
 fstream book(FILENAME);//创建文件对象,并给其初始化为FILENAME
 if (book.fail())
 {
  cerr << "open file with read error" << endl;
  _exit(-127);
 }
 ///////////打开临时文件///////////
 ofstream temp(TEMP);
 if (temp.fail())
 {
  cerr << "open file with read error" << endl;
 }
 //////////////////////////////////
 ////////预查找////////////////////
 if (!pre_search_record(name))
 {
  cout<<"无记录"<<endl;
 }
 ////////查找记录//////////////////
 string s;
 while(getline(book,s))
 {
  //////将获取的行中的相关内容提取////////
  clean_gloabal_var(1);
  clean_gloabal_var(2);
  getname(s);
  string_to_char(name);
  if (cmpstr(_name,_char1))
  {
   ;
  }
  else{
   temp<<s<<endl;
  }
  ////////////////////////////////////////
 }
 /////////////////////////////////
 book.close();
 temp.close();
 re_store();//数据回写
}
/////////////////////////////////////////////////
char* Change_sequence_number(string s){
 char S[256];
 int i=0;
 while(s[i]!=' ')
  i++;
 while(s[i]=' ')
  i++;
 ifstream file(FILENAME);
 string str;   
 int count = 0;   
 while(file) {       
  getline(file, str);//从文件中读取一行       
  remove(str.begin(),str.end(),' ');//这个算法函数在algorithm头文件中,删除一行中的空格       
  remove(str.begin(),str.end(),'\t');//删除一行中的制表符,因为制表符和空格都是空的       
  if (str.length()>0) {//如果删除制表符和空格之后的一行数据还有其他字符就算有效行           
   count ++;       
  }
 }
 file.close();
 char a=(char)count;
 cout<<a<<endl;//编号的类型转换;
 s[i]=a;
 int j=0;
 while(s[j]!='\0'){
  S[j]=s[j];
  j++;
 }
 S[j]='\0';
 return S;
}
void change_record(string name){//修改记录
 cout<<"====================================================="<<endl;
 delete_record(name);//删除原记录
 new_record();//添加新记录
 cout<<"====================================================="<<endl;
}


/////////子函数集////////////////////////////////
/////////////////////////////////////////////////
////////sonsonsonsonsonsonsonsonsonson///////////
char* getname(string s){//获取每条记录(行)中的姓名
 int i=0;
 //_name="";
 while(s[i]!=' '){
  _name[i]=s[i];
  i++;
 }
 _name[i+1]='\0';
 char* ch;
 ch=&(_name[0]);
 return ch;
}

char* string_to_char(string s){//将string型的name变为char[10]
 int len=s.length();
 int i;
 for (i=0;i<len;i++)
 {
  _char1[i]=s[i];
 }
 _char1[i+1]='\0';
 char* ch;
 ch=&(_char1[0]);
 return ch;
}

bool cmpstr(char *s1,char *s2){//比较char[10]是否相同
 int i=0;bool rst;
 while(s1[i]!='\0'){
  if (s1[i]!=s2[i])
  {
   rst=false;//不等
   break;
  }
  i++;
  rst=true;//相等
 }
 return rst;
}

void re_store(){//回储函数,将temp中的内容回储到文件
 ifstream temp(TEMP);
 if (temp.fail())
 {
  cerr<<"打开缓存文件错误";
 }
 ofstream book(FILENAME);
 if (book.fail())
 {
  cerr<<"打开文件错误";
 }
 ///////////////////////////////
 ///////将文件回写//////////////
 string s;
 while(getline(temp,s))
 {

  //Change_sequence_number(s);
  book<<s<<endl;
 }

}

void init(){//初始化
 fstream _file;
 _file.open(FILENAME,ios::in);
 if(!_file)
 {
  //creat file;
  _file.open(FILENAME,ios::out);
 }
 _file.close();

 fstream _temp;
 _temp.open(TEMP,ios::in);
 if(!_temp)
 {
  //creat _temp;
  _temp.open(TEMP,ios::out);
 }
 _temp.close();
}

void clean_gloabal_var(int var){//清空全局变量
 if (var=1)//1 is _name
 {
  for(int i=0;i<10;i++){
   _name[i]='\0';
  }
 }
 if (var=2)//2 is _char1
 {
  for (int i=0;i<10;i++)
  {
   _char1[i]='\0';
  }
 }
}
/////////////////////////////////////////////////

你可能感兴趣的:(编程,数据,通讯录)