⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 note.cpp

📁 c++ 写的通讯录.利用 file来做数据库. 完成基本功能. 缺点是有点繁琐.
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<fstream.h>
#include<stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include<iomanip.h>
typedef int Status;
typedef struct lnode *LinkList;

struct ElemType                //----------定义结构体数组用于缓存数据----------
{
    char name[20];
	char phnum[20];
};

struct lnode
{                              //----------通讯录结构中结点的定义----------
	ElemType data;
	LinkList next; 
};

class File                    //----------定义文件的类----------
{
public:
	char Filename[20];
	manu();              //程序表头
	opFile();            //打开旧文件
	opFile2();           //打开旧文件
	opFile3();           //默认文件赋值
	NewFile();           //新建文件
	New2File();          //新建打开失败后的文件
	New3File();          //覆盖原有文件
	FileCopy();          //文件copy
};

File::opFile()           //----------打开旧文件
{
	char t;
	cout<<"请输入打开文件名称:";
	cin>>Filename;
	fstream out(Filename,ios::nocreate|ios::app);
	if(!out)
	{
		cout<<"没有此文件!!!"<<endl<<"(1)重新输入打开文件     (2)新建"<<Filename<<"文件"<<endl<<"选择:";
		cin>>t;
		switch (t)
		{
		case '1':
			opFile();
			break;
		case '2':
			New2File();
			break;
		}
	}
	out.close();
}//----------opFile----------

File::opFile2()
{
	fstream out(Filename,ios::nocreate|ios::app);
	out.close();
}//----------opFile2----------

File::opFile3()                    //-----------默认文件赋值
{
	char Cat[20]={'C','a','t','.','t','x','t'};
	strcpy(Filename,Cat);
	fstream out(Filename,ios::nocreate|ios::app);
	out.close();
}//----------opFile3----------


File::New3File()
{
	fstream out(Filename,ios::trunc);
	out.close();
}//----------New3File----------

File::New2File()                   //-----------新建文件
{
	fstream out(Filename,ios::app);
}//----------New2File----------


File::NewFile()//新建文件
{
 	cout<<"输入新建文件名:";
	cin>>Filename;
	fstream out(Filename,ios::nocreate|ios::app);
	if(!out)
	{
		cout<<"OK!"<<endl;
	}
	else
	{
		cout<<"文件已存在!!"<<endl;
		cout<<"(1)重新输入   (2)覆盖原文件   (3)打开"<<Filename<<"文件   (4)返回主菜单"<<endl;
		cout<<"选择: ";
		int c;cin>>c;
		switch (c)
		{
		case 1:
			NewFile();break;
		case 2:
			cout<<"覆盖成功!!!"<<endl;
		    New3File();break;
		case 3:
			opFile2();break;
		case 4:
			manu();
			int e;
          	cin>>e;
	        switch (e)
			{
        	case 1:
	        	opFile();break;
        	case 2:
	        	NewFile();break;
			}break;
		}
	}out.close();
}//----------NewFile----------

File::FileCopy()//----------文件的复制-------------------
{
	char ch,TFile1[20],TFile2[20];
	cout<<"输入原文件:";
	cin>>TFile1;
	cout<<"把"<<TFile1<<"文件拷贝到::";
	cin>>TFile2;
	ifstream f1(TFile1);
	ofstream f2(TFile2);
	while(f2&&f1.get(ch)) f2.put(ch);
	f1.close();
	f2.close();
}//------------FileCopy-------------------

File::manu()//---------程序表头---------------
{  	cout<<"Made By CatCat.cod@Wong..."<<endl;
    cout<<"thanks for useing...."<<endl;
	cout<<"   ━━━━━━━━━━━.                  .━━━━━━━━━━"<<endl;
    cout<<"	━━━━━━      \              /      ━━━━━"<<endl;
    cout<<"              ━━━━     \   ★  ★   /     ━━━━"<<endl;
    cout<<"                  ━━━      .  \/ .     ━━━"<<endl;
    cout<<"	                  ____;       ;____ "<<endl;
    cout<<"	                      /'/ \'\"<<endl;
    cout<<"	     ┏━━━━━━━━UU━━━UU━━━━━━━━━┓"<<endl;
    cout<<"             ┃                                            ┃"<<endl;
    cout<<"	     ┃           WelCome To CatCat Program        ┃"<<endl;
    cout<<"	     ┃                                            ┃"<<endl;
    cout<<"	     ┃                                  Cherrylim ┃"<<endl;
    cout<<"             ┗━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;    
	cout<<"━━━━━━━━━━━━━━━━━━通讯录━━━━━━━━━━━━━━━━━━━"<<endl;
	cout<<"(1)打开文件..."<<endl<<"(2)新建文件..."<<endl<<"(3)默认文件..."<<endl<<endl;
	cout<<"选择: ";
}//----------manu---------------
 
class T_list: public File   //-----定义链表的类,用于暂时储存文件中的数据以及进行操作--------
{                           //-----File类的派生----------------------------------------------
	int N;    //计算链表的长度,用于确定数据个数与打印。
public:

	Getelem_L(LinkList L);//数据查找,姓名与电话查找合并。
	ListInsert_L(LinkList &L,int i,ElemType e);//数据插入。
	ListDelete_L(LinkList &L,ElemType &e);//数据删除,删除数据位置。
	CreatList_L(LinkList &L);//创建链表并把文件数据读入链表。
	AddFileToList(LinkList &L,int i,ElemType e);//从另外的文件添加数据到链表中。
	printlist(LinkList L);//打印操作的数据。
	Save(LinkList L);//数据保存到正在操作的文件,文件保存。
	Save2(LinkList L);//数据另存到用户定义的文件,文件另存为。

};

T_list::Getelem_L(LinkList L)//---------数据查找------
{
	LinkList p;
	char temp[20];
	int i=0,j=0,k=0,m=0;
	cout<<"输入查找数据:";
	cin>>temp;	p=L->next;
	for (i=0;i<N;i++){
		if (strcmp(temp,p->data.name)==0)//--------先对数据中的姓名进行查找
		{
			cout<<"找到数据在第"<<i+1<<"位置上"<<endl;
			cout<<"("<<i+1<<")"<<setw(5)<<"姓名:"<<setw(10)<<p->data.name<<setw(20);
		    cout<<"电话:"<<setw(10)<<p->data.phnum<<endl;
		}
		else//--------K,用于判断是否没有找到记录
			k++;
		if (strcmp(temp,p->data.phnum)==0)//--------再对数据中的电话进行查找
		{
			cout<<"找到数据在第"<<i+1<<"位置上"<<endl;
			cout<<"("<<i+1<<")"<<setw(5)<<"姓名:"<<setw(10)<<p->data.name<<setw(20);
		    cout<<"电话:"<<setw(10)<<p->data.phnum<<endl;
		}
		else//--------M,用于判断是否没有找到记录
			m++;
		p=p->next;
	}
	if(k==N&&m==N)
		cout<<"没有"<<temp<<"此记录"<<"\n\n";
	return 0;
}//--------------------Getelem_L

T_list::ListInsert_L(LinkList &L,int i,ElemType e)//-------数据插入------
{
	LinkList p,s;
	int j;p=L;j=0;
	cout<<"输入姓名:";	cin>>e.name;
    cout<<"输入电话:";	cin>>e.phnum;
	N++;
	while(p&&j<i-1){p=p->next;++j;}
	if(!p||j>i-1) return 0;
	s=(LinkList)malloc(sizeof(lnode));
	s->data=e;s->next=p->next;
	p->next=s;
	return 1;
}//------------------ListInsert_L

T_list::ListDelete_L(LinkList &L,ElemType &e)//-------数据删除-------
{
	int i,j=0;LinkList p,q;p=L;
	cout<<"输入删除位置:"; cin>>i;
	if(i>N) cout<<"错误操作!"<<endl;
	while(p->next&&j<i-1){p=p->next;++j;};
	if(!(p->next)||j>i-1)return 0;
	q=p->next;p->next=q->next;
	e=q->data; 
	cout<<"输入数据:"<<endl;//-------打印出被删除的数据-------
	cout<<"姓名:"<<setw(10)<<e.name<<setw(20);
	cout<<"电话:"<<setw(10)<<e.phnum<<endl;
	free(q); N--;
	return 1;
}//--------------------ListDelete_L

T_list::printlist(LinkList L)//-------打印链表数据-------
{
	int i;
    LinkList p=L->next;
	if(N==0)
	{
		cout<<"文件没有资料!"<<endl;
	}
    for(i=0;i<N;i++)
	{
		cout<<setw(2)<<"("<<setw(2)<<i+1<<")"<<setw(3);
		cout<<"  "<<"姓名:"<<setw(14)<<p->data.name<<setw(14);
		cout<<"电话:"<<setw(10)<<p->data.phnum;
		cout<<"\n";
		p=p->next;
     }
}//--------------------printlist

T_list::CreatList_L(LinkList &L)//------创建链表并把文件数据读入链表
{
	LinkList p;
	L=(LinkList)malloc(sizeof(lnode));
	L->next=NULL;
 	p=L->next=NULL;
	ifstream inf(Filename);
	N=0;
    while(inf.eof()==0)//--------文件读取 ------
	{
		p=(LinkList)malloc(sizeof(lnode));
	    inf.getline(p->data.name,20);
		inf.getline(p->data.phnum,20);
		p->next=L->next;L->next=p;
		N++;
	}
}//--------------CreatList_L

T_list::AddFileToList(LinkList &L,int i,ElemType e)//------文件添加
{ 
	LinkList p,s;
	int j;char TFN[20];
	p=L;j=0;
	cout<<"输入添加的文件名:";
	cin>>TFN;
	ifstream inf(TFN);
	while(inf.eof()==0)
	{
		inf.getline(e.name,20);
        inf.getline(e.phnum,20);
     	N++;
	    while(p&&j<i-1){p=p->next;++j;}
	    if(!p||j>i-1) return 0;
     	s=(LinkList)malloc(sizeof(lnode));
	    s->data=e;s->next=p->next;
     	p->next=s;
	}
	return 1;	
}//--------------AddFileToList

T_list::Save(LinkList L)//--------数据保存-------
{
    fstream out(Filename,ios::trunc);
	int i;
    LinkList p=L->next;
    for(i=0;i<N;i++)
	{ 	
		out<<p->data.name<<endl;
		out<<p->data.phnum;
		if(i!=N-1)
		{
			out<<endl;
		}
		p=p->next;
    }
	out.close();
}//-----------Save-----------

T_list::Save2(LinkList L)//-----------另存为-----------
{
	char tempFile[20];
	int i;
	LinkList p=L->next;
	cout<<"请输入另存为的文件名称:";
	cin>>tempFile;
	fstream wrt(tempFile,ios::trunc);
	for(i=0;i<N;i++)
	{ 	
		wrt<<p->data.name<<endl;
		wrt<<p->data.phnum;
		if(i!=N-1)
		{
			wrt<<endl;
		}
		p=p->next;
    }
	wrt.close();
}//-----------Save-----------


main()//--------主程序--------
{ 
	T_list get;
    LinkList L;
 	ElemType e;
 	char a,b,c,d,f;//--------各个循环的控制定义
	do{
		get.manu();
		cin>>a;
		switch (a)
		{
		case '1':
			get.opFile();
			break;
		case '2':
			get.NewFile();
			break;
		case '3':
			get.opFile3();
			break;
		default:
			cout<<"错误操作!"<<endl;
		break;
		}
	}while (a!='1'&&a!='2'&&a!='3');
	get.CreatList_L(L);//--------确定文件名称后读取文件
	get.printlist(L);

cout<<"-------------------文件操作------------------------"<<endl;
    do{
		cout<<endl<<"(1)添加资料        (2)删除资料       (3)查找资料       (4)浏览通讯录";
		cout<<endl<<"(5)保存操作        (6)其他文件操作   (7)退出程序"<<endl;
		cout<<"选择:";
		cin>>b;
		switch (b)
		{
		case '1':
			get.ListInsert_L(L,1,e);
			break;
		case '2':
			get.ListDelete_L(L,e);
            break;
		case '3':
			get.Getelem_L(L);
			break;
		case '4':
			get.printlist(L);
			break;			
		case '5':
			cout<<"是否保存操作?(y/n):";
			cin>>d;
			if(d=='y'||c=='Y')
				{
					get.Save(L);
					cout<<"文件储存!!"<<endl;
				}
			else
			   cout<<"放弃储存!!"<<endl;
			break;
		case '6':
			do{
				cout<<endl<<"(1)另存为...     (2)文件的拷贝     (3)添加别的文件到此文件中";
		        cout<<"     (4)返回"<<endl;
	         	cout<<"选择:";
		        cin>>f;
				switch (f)
				{
				case '1':
					get.Save2(L);
					cout<<"操作完成!"<<endl;
					break;
				case '2':
					get.FileCopy();
					break;
				case '3':
					get.AddFileToList(L,1,e);
					cout<<"添加成功!!";
					break;
				case '4':
					break;
				default:
					cout<<"错误输入!!"<<endl;
					break;
				}
			}while (f!='4');
			break;
		case '7':
			cout<<"---------提示!!!---------"<<endl;
			cout<<"是否保存操作?(y/n):";
			cin>>c;
			if(c=='y'||c=='Y')
				{
					get.Save(L);
					cout<<"文件储存!!"<<endl;
				}
			else 
				cout<<"放弃储存!!"<<endl;
			break;
		default:
            cout<<"错误输入!!"<<endl;
			break;
		}
	}
	while (b!='7');
}
//------------------------程序完毕!!----------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -