//: functions.cpp
#include "functions.h"
#include<fstream>
#include<iostream>
using namespace std;
//功能: 显示记录
//参数: list类对象的引用li
void showRecord(list& li){
li.show();
}
//功能: 查询记录
//参数: list类对象的引用li
void searchRecord(list& li){
if(li.getEnd()->prev == NULL){ //判断记录是否为空
cout << "记录是空表,退出查询操作!" << endl << endl;
}else{
char choice ;
cout << "可以通过姓名或电话查询记录" << endl;
cout << "1. 通过姓名" << endl << "2. 通过电话" << endl;
do{
cin >> choice;
cin.clear();
switch(choice){
case '1': li.searchFromName(); break; //按姓名查询
case '2': li.searchFromNumber(); break; //按电话查询
default : cout << "输入错误,重选1-2: " ;
}
}while(choice != '1' && choice != '2');
}
}
//功能: 增加记录
//参数: list类对象的引用li
void addRecord(list& li){
string name;
string number;
cout << "输入数据,输入姓名为0时结束。" << endl;
char a[50];
char b[50];
cin.clear();
cin.ignore(); //清空cin缓存
while(1){
cout <<"姓名: ";
cin.getline(a,50); //保证输入的空格也能读入到name中
name = a;
if(name == "0"){ //输入姓名为0时结束
cout << endl;
break;
}
cout <<"电话: ";
cin.getline(b,50); //保证输入的空格也能读入到number中
number = b;
li.insert(name,number); //添加记录到li中
}
}
//功能: 删除记录
//参数: list类对象的引用li
void removeRecord(list& li){
if(li.getEnd()->prev == NULL){ //判断记录是否为空
cout << "通讯录已空,退出删除操作!" << endl << endl;
}else{
char choice ;
cout << "可以通过姓名或电话删除记录" << endl;
cout << "1. 通过姓名" << endl << "2. 通过电话" << endl;
do{
cin >> choice;
cin.clear();
switch(choice){
case '1': li.deleFromName(); break; //按姓名删除记录
case '2': li.deleFromNumber(); break; //按电话删除记录
default : cout << "输入错误,重选1-2: "; //异常处理
}
}while(choice != '1' && choice != '2');
}
}
//功能: 修改记录
//参数: list类对象的引用li
void modifyRecord(list& li){
if(li.getEnd()->prev == NULL){ //判断记录是否为空
cout << "记录是空表,退出修改操作!" << endl << endl;
}else{
li.modify(); //修改记录
}
}
//功能: 保存记录
//参数: list类对象的引用li
void saveRecord(list& li){
if(li.getEnd()->prev == NULL){ //判断记录是否为空
cout << "没有记录可存!" << endl << endl;
}else{
string fname("");
string s("");
//输入文件名,并判断是否为非法字符
s = cin.get();
cout << "请输入要存入的文件名(直接回车选择文件sname): ";
s = cin.get();
if(s == "\n"){ //当输入为回车时文件名为默认文件名sname
fname = "sname";
}else{
fname.append(s);
while((s = cin.get()) != "\n") //输入文件名
fname.append(s);
}
//打开文件以备写入数据,将数据写入结尾,如果没有则创建文件
ofstream outfile(fname.c_str(),ios::app);
if(!outfile){ //打开文件失败提示用户
cout << "不能存入文件!" << endl << endl;
}else{
nodePtr temp;
temp = li.getEnd()->prev;
while(temp != NULL){
outfile << temp->name << "\n" << temp->number << "\n";
temp = temp->prev ;
}
cout << li.getSize() << "条记录已经存入文件,请继续操作。" << endl << endl;
}
outfile << flush; //回写缓冲区(回写缓冲区会在保持文件打开的情况下保存文件)
outfile.close(); //关闭文件
}
}
//功能: 读取记录
//参数: list类对象的引用li
void readRecord(list& li){
string s("");
string fname(""); //定义变量保存读文件的文件名
//逐字符读数据,并判断数据信息
cin.get();
cout << "请输入要读取的文件名(直接回车选择文件名sname): ";
s = cin.get();
if(s == "\n"){ //当直接输入回车则采取默认文件名
fname = "sname";
}else{
fname.append(s);
while((s = cin.get()) != "\n"){ //输入要读取的文件名
fname.append(s);
}
}
ifstream infile(fname.c_str()); //打开文件以备读数据
//判断是否打开文件
if(!infile){
cout << "打不开文件! 请重新选择" << endl << endl;
}else{
string nam;
string num;
int count = 0; //计数, 即读取的节点(记录)个数
//读文件
while(getline(infile, nam)){
getline(infile, num);
li.insert(nam, num);
count++;
}
cout << endl << "读取了" << count << "条记录!" << endl << endl;
cout << "现在通讯录中共有" << li.getSize() << "条记录" << endl << endl;
}
infile.close(); //关闭文件
}
//功能: 新建通讯录
//参数: list类对象的引用li
void newRecord(list& li){
//判断文件是否被改动,如果改动则提示用户是否保存。
string c;
if(li.getEnd()->prev != NULL){
cout << "文件已改动,是否要保存?(Y/N)" << endl;
cin >> c;
cin.clear();
while(c != "N" && c != "n" && c != "Y" && c != "y"){ //输入错误处理
cout << "错误输入,请重输Y/N" << endl;
cin>>c;
cin.clear();
}
if(c == "Y" || c == "y"){
saveRecord(li); //调用保存记录函数
}
}
li.cleaUp(); //清空list对象li
addRecord(li); //为li增加记录
}
//功能: 功能菜单
//参数: list类对象的引用li
void main_window(list& li){
char n ;
//打印欢迎界面
cout << "\t" << "**********************************" <<endl;
cout << "\t" << "* 欢迎使用通讯录 *" <<endl;
cout << "\t" << "* 作者:张龙伟 *" <<endl;
cout << "\t" << "* 班级:RJ010601 *" <<endl;
cout << "\t" << "* 学号:063249 *" <<endl;
cout << "\t" << "**********************************" <<endl <<endl <<endl;
while(1){
cout << "1. 显示记录" <<endl;
cout << "2. 查询记录" <<endl;
cout << "3. 增加记录" <<endl;
cout << "4. 删除记录" <<endl;
cout << "5. 修改记录" << endl;
cout << "6. 保存记录" <<endl;
cout << "7. 读取记录" <<endl;
cout << "8. 新建通讯录" <<endl;
cout << "9. 结束运行" <<endl;
cout <<endl << "左边数字对应功能选择, 请选1-8: " ;
cin >> n;
cin.clear();
cout << endl;
switch(n){
case '1': showRecord(li); //显示记录
break;
case '2': searchRecord(li); //查询记录
break;
case '3': addRecord(li); //增加记录
break;
case '4': removeRecord(li); //删除记录
break;
case '5': modifyRecord(li); //修改记录
break;
case '6': saveRecord(li); //保存记录
break;
case '7': readRecord(li); //读取记录
break;
case '8': newRecord(li); //新建通讯录
break;
case '9': exit(1); //结束运行
default: cout << "输入错误!" << endl << endl;
}
}
}