//已经有了文件连续编号功能,删除某行的时候的编号修改功能进行中。
#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';
}
}
}
/////////////////////////////////////////////////