本文实例为大家分享了C++实现简单通讯录的具体代码,供大家参考,具体内容如下
说明:
1 程序中运用到两个类,一个是Person类,另一个是List类。前者存储用户信息,后者主要用于操作,如增删改查等。但由于本程序中没有涉及到太复杂的功能,用户信息可以由一个简单的结构体表示,但是为了以后拓展方便,和达到学习运算符重载的目的,还是使用了类。
2 List类中的Reflush()方法用户刷新文件内容,即每次修改了vector后要将最新内容写入到文件。因此增删改操作中都要调用该操作,这种方法在数据库开发中常用到,以小见大。
3 setout()方法设置字符左对齐,便于美观。另外std::cout.width(15)设置输出字符域宽度,只对下一次输出有效。
4 判断文本文件是否为空还有另一种方法,即string类中的empty()方法,但为了读取方便没有采用。
5 其实对于通讯录的操作只是在类内的vector容器中进行,只有最后刷新的时候同步到磁盘文件中。
6 一些函数中设置多个返回值有利于判断操作的情况。
Person.h 与cpp文件:
#ifndef PERSON_H_
#define PERSON_H_
#include <string>
class Person
{
public:
std::string name;
std::string tel;
public:
Person();
~Person();
int operator==(const Person& p);//重载==运算符,本程序中并没有用到
private:
};
#endif // !PERSON_H_
#include "Person.h"
Person::Person()
{
}
Person::~Person()
{
}
int Person::operator==(const Person& p)
{
if (this->name == p.name)
{
if (this->tel == p.tel)
return 0;
else
return -1;
}
else
return -2;
}
List.h文件:
#ifndef LIST_H_
#define LIST_H_
#include <vector>
#include "Person.h"
class List
{
public:
List();
~List();
void Showfile();//显示通讯录
int Readfile();//从磁盘读取文件
void Add();
void Reflush();//刷新数据,即重新写入磁盘
void Del();
void Search();
private:
std::vector<Person> myfile;
};
inline void setout();//输出格式控制
#endif
List.cpp文件:
#include "List.h"
#include <iostream>
#include <fstream>
#include <string>
List::List()
{
}
List::~List()
{
}
void setout()//输出格式控制,即左对齐
{
std::cout.setf(std::ios_base::left, std::ios_base::adjustfield);
}
void List::Showfile()
{
std::vector<Person>::iterator iter;
setout();
for (iter = this->myfile.begin(); iter != this->myfile.end(); iter++)
{
std::cout.width(15);//字域宽度为15
std::cout << iter->name;
std::cout.width(15);
std::cout << iter->tel << "\n";
}
}
int List::Readfile()
{
std::fstream readfile("mylist.txt");
int rows = 0;
if (readfile)//如果文件存在
{
std::cout << "*******Telephone book********\n";
std::cout << "name:" << "\t\t" << "phone:" << "\n";
Person p;
if (!(readfile >> p.name >> p.tel))//如果第一次读取为空
{
std::cout << "\tNULL\n";
return 1;
}
myfile.push_back(p);
rows++;
while(readfile>>p.name>>p.tel)//读取后存入vector容器中
{
rows++;
myfile.push_back(p);
}
this->Showfile();
std::cout << "Total:\t" << rows << "\tinfos\n";
readfile.close();
return rows;
}
else
{
std::ofstream outfile;//磁盘中不存在文件的话则创建
outfile.open("mylist.txt");
if (!outfile.is_open())
{
std::cout << "file is not created!\n";
return -1;
}
else
{
std::cout << "file not exist but we have created one for you!\n";
std::cout << "*******Telephone book********\n";
std::cout << "name:" << "\t\t" << "phone:" << "\n";
std::cout << "\tNULL\n";
}
outfile.close();
}
return 2;
}
void List::Reflush()
{
std::ofstream outfile("mylist.txt");
std::vector<Person>::iterator iter;
setout();
for (iter = this->myfile.begin(); iter != this->myfile.end(); iter++)
{
outfile.width(15);
outfile << iter->name;
outfile.width(15);
outfile << iter->tel << "\n";
}
outfile.close();
}
void List::Add()
{
Person p;
std::cout << "please input the name:\n";
std::cin >> p.name;
std::cout << "please input the phone\n";
std::cin >> p.tel;
std::cout << "sucessfully created!\n";
myfile.push_back(p);
this->Reflush();
}
void List::Del()
{
if (myfile.empty())
{
std::cout << "no info to del!\n";
return;
}
std::string name;
std::cout << "please input the name you want you del:\n";
std::cin >> name;
std::vector<Person>::iterator iter;
for (iter = this->myfile.begin(); iter != this->myfile.end();)
{
if (iter->name == name)
{
myfile.erase(iter);//删除对应项
std::cout << "sucessfully delete!\n";
this->Reflush();
return;
}
else
++iter;
}
std::cout << "no info matches!\n";
}
void List::Search()
{
std::string name;
std::cout << "please input the name you want to search:\n";
std::cin >> name;
std::vector<Person>::iterator iter;
for (iter = this->myfile.begin(); iter != this->myfile.end(); iter++)
{
if (name == iter->name)
{
std::cout << iter->name << "\t\t" << iter->tel << "\n";
return;
}
}
std::cout << "no info matches!\n";
}
main文件:
// contact.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "List.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
int Menu()
{
int num;
cout << "********************" << endl;
cout << "* 1 ADD *" << endl;
cout << "* 2 DEL *" << endl;
cout << "* 3 SEARCH *" << endl;
cout << "* 4 SHOW *" << endl;
cout << "* 5 EXIT *" << endl;
cout << "********************" << endl;
cout << "input the num:";
cin >> num;
return num;
}
int _tmain(int argc, _TCHAR* argv[])
{
List mylist;
mylist.Readfile();
int num = Menu();
bool flags = 1;
while (flags)
{
switch (num)
{
case 1:
mylist.Add();
break;
case 2:
mylist.Del();
break;
case 3:
mylist.Search();
break;
case 4:
mylist.Showfile();
break;
case 5:
cout << "Bye.\n";
return 0;
default:
cout<<"没有该选项请重输!\n";
break;
}
cout << "请输入选项:\n";
cin >> num;
}
system("pause");
return 0;
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持亿速云。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。