返回顶部

收藏

C++课设——通讯录管理系统

更多
/////////////////////////////////////////////////
//////////开发环境Visual Studio 2010/////////////
/////////////////////////////////////////////////
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
#define FILENAME "C:\\\\phonebook.txt"
#define TEMP "C:\\\\phonebook.李俊"
///////////////////////////////
struct Record{
public:
    string name;
    string sex;
    string tel;
};
///////////////////////////////
//////全局变量/////////////////
char _name[10];//姓名
char _char1[10];//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||||||||

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;
    run(i);
    system("pause");
    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;
            search_record(s);
            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:
        ;
    }
}
////////////////////////////////////////////////////////

void new_record(){
    Record rec=input_rec();
    add_record(rec);
}

Record input_rec(){//输入新记录
    string name,sex,tel;
    cout<<"请输入记录:"<<endl;
    cout<<"姓名:";
    cin>>name;
    cout<<"性别:";
    cin>>sex;
    cout<<"电话:";
    cin>>tel;
    ////////////////////
    Record rec;
    rec.name=name;
    rec.sex=sex;
    rec.tel=tel;
    ////////////////////
    return rec;
}

void add_record(Record rec){//写入新记录
    ////处理结构体//////
    string name=rec.name;
    string sex=rec.sex;
    string tel=rec.tel;
    ////////////////////
    ofstream fout;
    fout.open(FILENAME,ios::app);//文件不存在时会主动创建
    if (fout.fail())
    {
        cerr<<"open file with write error"<<endl;
    }
    fout<<name<<"   "<<sex<<"   "<<tel<<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);
    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;
        _exit(-127);
    }
    string s=" ";
    cout<<"====================================================="<<endl;
    while(getline(book,s))
    {
        //////将获取的行中的相关内容提取////////
        //if (*(getname(s))==*(string_to_char(name)))比较字符串应该用strcmp//但是却不能比较char型,只能const char
        clean_gloabal_var(1);
        clean_gloabal_var(2);
        getname(s);
        string_to_char(name);
        if (cmpstr(_name,_char1))
        {
            cout<<s<<endl;
            //break;
        }
        ////////////////////////////////////////
    }
    cout<<"====================================================="<<endl;
    bool rst;
    if (s==" ")
    {
        rst=false;
    }else{
        rst=true;
    }
    book.close();
    if (!rst)
    {
        cout<<"查无记录"<<endl;
    }
    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);
    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();//数据回写
}
/////////////////////////////////////////////////
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]!='\\t'){
        _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))
    {
        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';
        }
    }
}
/////////////////////////////////////////////////
//该片段来自于http://outofmemory.cn

标签:c++,基础

收藏

1人收藏

支持

0

反对

0

相关聚客文章
  1. pansunyou 发表 2014-11-30 02:51:00 C++通用跨数据库访问方案之一: 基础组件cdbc
  2. linux@linux.cn (linu 发表 2016-11-04 02:37:00 C++ 程序员 Protocol Buffers 基础指南
  3. tanglei 发表 2014-05-28 15:08:01 struct与class区别联系
  4. 博主 发表 2016-06-28 05:17:59 Bazel C++ 基础[翻译]
  5. 博主 发表 2011-11-03 16:00:00 C++ 语言基础
  6. thinkpc 发表 2016-03-04 13:55:30 c++&nbsp;11 map基础value排序
  7. 王朝阳 发表 2013-03-01 00:00:00 旅游规划编制的基础思路
  8. mortoray 发表 2013-03-14 18:20:04 Parsing an exact decimal value using GMP
  9. Herb Sutter 发表 2012-06-05 19:03:20 GotW #104: Solution
  10. Herb Sutter 发表 2012-11-03 22:06:31 Talk now online: The Future of C++ (VC++, ISO C++)
  11. Boris Kolpackov 发表 2012-10-16 15:51:35 Custom C++ to Database Type Mapping in ODB
  12. dutor 发表 2011-10-16 14:19:12 调试基础:内存转储

发表评论