|

楼主 |
发表于 2022-7-25 23:08:22
|
显示全部楼层
问题解决了,因为在程序里使用了string类型,该类型是在堆里new出来的。复制的时候把指针一块复制进去了造成了指针混乱,把string换成char就行了下面是改好的程序- // 引用.cpp : 定义控制台应用程序的入口点。
- //
- #include "StdAfx.h"
- #include <iostream>
- #include <fstream>
- using std::string;
- using namespace std;
- #define MAX 20//先定一个小的本子存20人;
- //定义联系人结构
- struct Person //结构名称为Person;
- { //姓名用64个字节
- char m_Name[64];
- //性别用整数
- int m_Sex;
- //年龄用整数
- int m_Age;
- //电话号码用20字节char数组
- char m_Phone[20];
- //地址用128字节char数组
- char m_Addr[128];
- };//记得加分号;
- //以下定义记录本结构
- struct bk
- { //第一个元素是person结构类型的数组;
- struct Person perArr[MAX];
- //记录本里的序列号;
- int m_Size;
- };//记得加分号;
- struct bk book;//定义一个记录本类型的变量用来存储真实数据;
- /****************************************************************
- //自己写的拷贝函数用来进行字符串拷贝
- target是目标char数组,source是源char字符串;
- ******************************************************************/
- void mycpy(char *target, const char *source)
- {
- if ( source == NULL) //如果是空字符串就没必要拷贝了;
- {
- return ;
- }
- int i = 0; //定义一个整型变量用来当下标;
- while (source[i] != '\0')//从第零个下标指示的源数组开始拷贝直到出现\0
- {
- target[i] = source[i];//逐个字节拷贝;
- i++; //下标自增;
- }
- target[i] = '\0';//\0没有拷贝走,最后往目标数组最后补充\0代表字符串结尾;
- }
- //3------添加联系人
- void addPerson()
- {
- //判断通讯录是否已满,满了就不再添加
- if (book.m_Size == MAX)
- {
- cout << "通讯录已满,无法添加" << endl;
- return;
- }
- else
- {
- //姓名
- char name[64];
- cout << "请输入姓名:" << endl;
- cin >> name;//键盘输入字符串存入name[]char 数组;
- //用自己写的拷贝函数逐字节地把输入的字节考入结构体内的数组;
- mycpy(book.perArr[book.m_Size].m_Name , name);
- //性别
- cout << "请输入性别:" << endl;
- cout << "1-----男" << endl;
- cout << "2-----女:" << endl;
- int sex = 0;
- while (true)
- {
- cin >> sex;
- if (sex == 1 || sex == 2)
- {
- book.perArr[book.m_Size].m_Sex = sex;
- break;
- }
- cout << "输入有误,请重新输入" << endl;
- }
- //年龄
- cout << "请输入年龄:" << endl;
- int age = 0;
- cin >> age;
- book.perArr[book.m_Size].m_Age = age;
- //电话
- cout << "请输入电话:" << endl;
- char phone[20];
- cin >> phone;
- ////用自己写的拷贝函数逐字节地把输入的字节考入结构体内的数组;
- mycpy(book.perArr[book.m_Size].m_Phone, phone);
- //住址
- cout << "请输入住址:" << endl;
- char address[128];
- cin >> address;
- //用自己写的拷贝函数逐字节地把输入的字节考入结构体内的数组;
- mycpy(book.perArr[book.m_Size].m_Addr ,address);
- //更新通讯录人数
- book.m_Size++;
- cout << "添加成功" << endl;
- system("pause");
- system("CLS");//清空屏幕
- }
- }
- //4---- -显示所有联系人
- void showPerson()
- {
- //判断通讯录中人数是否为0
- if (book.m_Size == 0)
- {
- cout << "当前记录为空" << endl;
- }
- else
- {
- for (int i = 0; i < book.m_Size; i++)
- {
- //姓名
- cout << "姓名" << book.perArr[i].m_Name << "\t";
- //年龄
- cout << "年龄" << book.perArr[i].m_Age << "\t";
- //性别
- cout << "性别" << (book.perArr[i].m_Sex == 1 ? "男" : "女") << "\t";
- //电话
- cout << "电话" << book.perArr[i].m_Phone << "\t";
- //住址
- cout << "住址" << book.perArr[i].m_Addr << endl;
- }
- }
- system("pause");
- system("CLS");
- }
- //5------检测联系人是否存在,如果存在,返回联系人所在的数组中的具体位置,不存在返回-1
- int isExist(char name[64])
- {
- for (int i = 0; i < book.m_Size; i++)
- {
- //找到用户输入的姓名了
- //用字符比较函数strcmp比较两个字符串里的内容是否相同,相同返回0;所以取反;
- if(!( strcmp(book.perArr[i].m_Name , name)))
- {
- return i;//若相同返回下表号;
- }
- }
- return -1; //如果遍历结束都没有找到,返回-1
- }
- //6------ -删除指定联系人
- void deletePerson()
- {
- cout << "请输入你要删除的联系人" << endl;
- char name[64];
- cin >> name;
- //ret==-1未查到
- //ret!=1查到了
- int ret = isExist( name);
- if (ret != -1)
- { //这里写得罗嗦了,直接用最后一个覆盖被删除的比这个快;
- for (int i = ret; i < book.m_Size; i++)
- {
- book.perArr[i] = book.perArr[i + 1];
- }
- book.m_Size--; //更新通讯录的人员数
- }
- else
- {
- cout << "查无此人" << endl;
- }
- }
- //7--------查找指定联系人信息
- void findPerson()
- {
- cout << "请输入你要查找的联系人" << endl;
- char name[64];
- cin >> name;
- //判断指定的联系人是否在通讯录中
- int ret = isExist(name);
- if (ret != -1)
- {
- //姓名
- cout << "姓名" << book.perArr[ret].m_Name << "\t";
- //性别
- cout << "性别" << book.perArr[ret].m_Sex << "\t";
- //年龄
- cout << "年龄" << book.perArr[ret].m_Age << "\t";
- //电话
- cout << "电话" << book.perArr[ret].m_Phone << "\t";
- //住址
- cout << "住址" << book.perArr[ret].m_Addr << "\t";
- }
- else
- {
- cout << "查无此人" << endl;
- }
- system("pause");
- system("CLS");
- }
- //8------------修改指定联系人信息
- void modifyPerson()
- {
- cout << "请输入你要修改的联系人" << endl;
- char name[64];
- cin >> name;
- int ret = isExist(name);
- if (ret != -1)
- {
- //姓名
- char name[64];
- cout << "请输入姓名" << endl;
- cin >> name;
- mycpy(book.perArr[ret].m_Name , name);
- //性别
- cout << "请输入性别" << endl;
- cout << "1---男" << endl;
- cout << "2---女" << endl;
- int sex = 0;
- while (true)
- {
- cin >> sex;
- if (sex == 1 || sex == 2)
- {
- book.perArr[ret].m_Sex = sex;
- break;
- }
- cout << "输入有误,请重新输入" << endl;
- }
- //年龄
- cout << "请输入年龄" << endl;
- int age = 0;
- cin >> age;
- book.perArr[ret].m_Age = age;
- //电话
- cout << "请输入电话" << endl;
- char phone[20];
- cin >> phone;
- mycpy(book.perArr[ret].m_Phone, phone);
- //住址
- cout << "请输入住址" << endl;
- char address[128];
- cin >> address;
- mycpy(book.perArr[ret].m_Addr , address);
- cout << "修改成功" << endl;
- }
- else
- {
- cout << "查无此人" << endl;
- }
- system("pause");
- system("CLS");
- }
- //9----------------清空所有联系人
- void cleanPerson()
- {
- book.m_Size = 0;
- cout << "通讯录已清空" << endl;
- system("pause");
- system("CLS");
- }
- void showMoun()
- {
- cout << "**************************" << endl;
- cout << "***** 1.添加联系人 *****" << endl;
- cout << "***** 2.显示联系人 *****" << endl;
- cout << "***** 3.删除联系人 *****" << endl;
- cout << "***** 4.查找联系人 *****" << endl;
- cout << "***** 5.修改联系人 *****" << endl;
- cout << "***** 6.清空联系人 *****" << endl;
- cout << "***** 0.退出通讯录 *****" << endl;
- cout << "**************************" << endl;
- }
- int main()
- {
-
- int codes=0; //定义一个整型变量用来判断文件是我们要的类型吗
- int filen=0; //定义一个整型变量用来存储文件长度;
- ifstream ifa; //定义一个用于输出的流对象ifa;
- book.m_Size = 0;//初始化通讯录中当前人员个数
- //查看是否有我们要用的记录
- ifa.open("d:\\通讯录.data",ios::in|ios::binary);
- if(ifa.is_open()) //如果打开文件成功查看是否是空文件
- {
- ifa.read((char*)&codes,4);//先二进制读4个字节看看跟我们预留的暗号0xa5a55a5a相符吗?
- if(codes==0xa5a55a5a) //如果相符
- {
- ifa.read ((char *)&filen,4);//如果相符再读4字节,这是我们上次写入的长度;
- //用char*强制类型转换;把上次的长度字节数读入到book对象;
- ifa.read((char *)&book,filen);//把上次写入的数据读入book;
- ifa.close(); //关闭文件;
- }//if(codes==0xa5a55a5a)结尾
- }// if(ifa.is_open()) 结尾;
- else//如果打开文件不成功则认为是首次使用
- book.m_Size = 0;//直接把下标放到首位;
- int tiaojian=1; //让死循环跳出的条件用了拼音;
- int select = 0; //初始化用户选择输入的变量
- ofstream ofa; //定义一个用于输出的文件对象;
- while (tiaojian)
- {
- showMoun(); //调用菜单
- cin >> select;
- switch (select)
- {
- case 1: //1.添加联系人
- addPerson();
- break;
- case 2: //2.显示联系人
- showPerson();
- break;
- case 3: //3.删除联系人
- deletePerson();
- break;
- case 4: //4.查找联系人
- findPerson();
- break;
- case 5: //5.修改联系人
- modifyPerson();
- break;
- case 6: //6.清空通讯录
- cleanPerson();
- break;
- case 0: //0.退出通讯录
- cout << "欢迎下次使用" << endl;
- codes=0xa5a55a5a;//文件类型验证码;
- ofa.open("d:\\通讯录.data",ios::out|ios::binary);//先把内容存入文件再退出;
- ofa.write((const char *)&codes,4); //先写入4个字节验证码;
- filen=sizeof(book); //算出变量的长度,写入文件;
- ofa.write((const char *)&filen,4);
- ofa.write((const char *)&book,filen); //把对象book写入二进制文件;
- ofa.close(); //关闭文件;
- system("CLS");
- tiaojian=0;//跳出死循环;
- break;
- default:
- break;
- };//switch
- }//while()
- }
复制代码 |
|