一个C++中文件的问题?
谁能帮我解决下面的问题,辛辛苦苦写出来的,功能上有缺陷,找不出错在那里,很纠结。对于大家的帮助我会很感激的。
同学通信录程序,编写一个程序,将下面的同学信息存储到文件中。
name:具有21个字符空间的数组
age:一个整形变量
address:具有51个空间的字符数组
phone:具有14个空间的字符数组
email:具有51个空间的字符数组
该程序具有一个菜单,便于用户完成如下操作:
1)向文件中增加记录。
2)显示文件中的所有记录。
3)修改任意一个记录。
4)按照姓名查找一个同学的记录。
5)删除某个同学的记录。
输入有效性检验:输入的年龄不能为负,也不能大于200.
#include"iostream"
using namespace std;
#include"fstream"
#include"iomanip"
struct Info
{
char name[21];
int age;
char address[51];
char phone[14];
char email[51];
};
int i=0; //用来记录读指针到底几个位置了
void AddFile(fstream &);
void ShowFile(fstream &);
void EditFile(fstream &);
void SearchFile(fstream &);
void DeleteFile(fstream &);
int main()
{
fstream people("Info.dat",ios::in|ios::out|ios::binary);
int choice;
if(people.fail())
{
cout << "文件打开失败!\n";
exit(0);
}
while(true)
{
cout << "\n\t1: Add 2: Show 3: Edit 4: Search 5: Delete 6: Exit\n";
cin >> choice;
switch(choice)
{
case 1:
AddFile(people);
break;
case 2:
ShowFile(people);
break;
case 3:
EditFile(people);
break;
case 4:
SearchFile(people);
break;
case 5:
DeleteFile(people);
break;
case 6:
exit(0);
}
}
return 0;
}
//向文件中增加记录
void AddFile(fstream &file) //问:第一次添加时可以,但第二次添加时加不上啊?
{
Info person;
cout << "请输入下面的新信息:\n";
cout << "姓名:";
cin >> person.name;
cout << "年龄:";
cin >> person.age;
cin.ignore();
cout << "地址:";
cin.getline(person.address,51);
cout << "电话:";
cin.getline(person.phone,14);
cout << "E-mail:";
cin.getline(person.email,51);
file.seekp(0L,ios::end);//每次输入时,读指针都在文件尾,前面的数据不会被冲掉
file.write((char *)&person,sizeof(person));
file.flush();
}
//显示文件中的所有记录
void ShowFile(fstream &file)
{
Info person;
file.clear();
file.seekg(0L,ios::beg);
while(!file.eof())
{
file.read((char *)&person,sizeof(person));
if(file.fail())
break;
cout << "姓名:" << person.name;
cout << setw(20) << "年龄:" << person.age;
cout <<setw(20) << "地址:" << person.address << endl;
cout << "电话:" << person.phone;
cout << setw(21) << "E-mail" << person.email << endl;
cout << "**********************************************************";
cout << endl;
}
}
//修改任意一个记录
void EditFile(fstream &file)
{
Info person;
cout << "输入要修给信息的同学姓名并显示原信息" << endl;
cout << "**********************************************************" << endl;
i = 0;
SearchFile(file);
cout << "下面请输入新的信息:" << endl;
cout << "姓名:";
cin >> person.name;
cout << "年龄:";
cin >> person.age;
cin.ignore();
cout << "地址:";
cin.getline(person.address,51);
cout << "电话:";
cin.getline(person.phone,14);
cout << "E-mail:";
cin.getline(person.email,51);
file.seekp(i * sizeof(person),ios::beg); //使读指针直接指向要修改记录的地方
file.write((char *)&person,sizeof(person));
file.flush();
}
//按照姓名查找一个记录
void SearchFile(fstream &file) //可以正常的查找信息
{
Info person;
char compt[21];
file.clear();
cout << "请输入要查找的同学姓名:";
cin >> compt;
cin.ignore();
while(!file.eof())
{
file.seekg(i * sizeof(person),ios::beg);
file.read((char *)&person,sizeof(person));
if(file.fail())
break;
if(strcmp(compt,person.name) == 0)
{
cout << "姓名:" << person.name;
cout << setw(20) << "年龄:" << person.age;
cout << setw(20) << "地址:" << person.address << endl;
cout << "电话:" << person.phone;
cout << setw(21) << "E-mail" << person.email << endl;
cout << "**********************************************************";
cout << endl;
break;
}
i++;
}
}
//删除某个同学的记录
void DeleteFile(fstream &file) //问:想删除的记录删不掉啊?
{
Info person;
char choice;
int j;
cout << "请输入要删除信息同学的名字并显示其信息" << endl;
cout << "**********************************************************" << endl;
i = 0;
SearchFile(file);
j = i;
cout << "你确定要删除该同学信息吗!(输入Y或N)" << endl;
cin >> choice;
if(toupper(choice) == 'Y')
{
while(!file.eof())
{
file.seekg((j+1) * sizeof(person),ios::beg); //使读指针指向要修改数据的下一个位置
file.read((char *)&person,sizeof(person)); //读取数据
if(file.fail())
break;
file.seekp(j * sizeof(person),ios::beg); //使写指针直接指向要修改记录的地方
file.write((char *)&person,sizeof(person));
file.flush();
j ++;
}
}
else
cout << "信息未删除!" << endl;
}