本文实例为大家分享了C++实现简单通讯录的具体代码,供大家参考,具体内容如下
说明:
1 程序中运用到两个类,一个是Person类,另一个是List类。前者存储用户信息,后者主要用于操作,如增删改查等。但由于本程序中没有涉及到太复杂的功能,用户信息可以由一个简单的结构体表示,但是为了以后拓展方便,和达到学习运算符重载的目的,还是使用了类。
2 List类中的Reflush()方法用户刷新文件内容,即每次修改了vector后要将最新内容写入到文件。因此增删改操作中都要调用该操作,这种方法在数据库开发中常用到,以小见大。
3 setout()方法设置字符左对齐,便于美观。另外std::cout.width(15)设置输出字符域宽度,只对下一次输出有效。
4 判断文本文件是否为空还有另一种方法,即string类中的empty()方法,但为了读取方便没有采用。
5 其实对于通讯录的操作只是在类内的vector容器中进行,只有最后刷新的时候同步到磁盘文件中。
6 一些函数中设置多个返回值有利于判断操作的情况。
Person.h 与cpp文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#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_
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#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文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
#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文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#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文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
// 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;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_24282081/article/details/72621681