字符串输入输出问题,新手求助~!

夜龍 2013-06-19 05:23:43
是个通讯录的设计,就做了添加和显示两个函数,输出没问题,但是输入显示就有问题了,新手求助!
#include<iostream>
#include<fstream>
#include<stdlib.h>
#include<string>
#include<iomanip>//setw
using namespace std;

class Person{
private:
string name;
string tel;
string address;
string email;
string QQ;
public:
Person(){}
Person(string name,string tel,string address,string email,string QQ){
this->name = name;
this->tel = tel;
this->address = address;
this->email = email;
this->QQ = QQ;
}
void setName(string name){this->name = name;}
string getName(){return name;}
void setTel(string tel){this->tel = tel;}
string getTel(){return tel;}
void setAddress(string address){this->address = address;}
string getAddress(){return address;}
void setEmail(string email){this->email = email;}
string getEmail(){return email;}
void setQQ(string QQ){this->QQ = QQ;}
string getQQ(){return QQ;}
};

class Menu{
public:
Menu(){};
void add();
void del();
void find_name(); //查找(按姓名)
void find_tel(); //查找(按电话)
void alter(); //修改信息
void show(); //显示通讯录
void format(); //格式化通讯录
void sort(); //排序(按姓名)
void save(); //保存
};

void Menu::add(){
cout<<"姓名:";
string n;
cin>>n;
cout<<"电话号码:";
string t;
cin>>t;
cout<<"地址:";
string a;
cin>>a;
cout<<"邮箱:";
string e;
cin>>e;
cout<<"QQ号码:";
string Q;
cin>>Q;
ofstream outData("通讯录.dat",ios::app|ios::binary);
if(!outData){
cerr<<endl<<"打开文件失败!!"<<endl;
system("pause");
return;
}
/*outData.write(n.c_str(),n.size());
outData.write(t.c_str(),t.size());
outData.write(a.c_str(),e.size());
outData.write(e.c_str(),a.size());
outData.write(Q.c_str(),Q.size()); */
outData<<setiosflags(ios::left)<<n<<"|"<<t<<"|"<<a<<"|"<<e<<"|"<<Q<<"|"<<endl;

outData.close();

}

void Menu::del(){
cout<<"del"<<endl;
}

void Menu::find_name(){
cout<<"find_name"<<endl;
}

void Menu::find_tel(){
cout<<"find_tel"<<endl;
}

void Menu::alter(){
cout<<"alter"<<endl;
}

void Menu::show(){
ifstream inData("通讯录.dat",ios::in|ios::binary);
if(!inData){
cout<<endl<<"找不到文件!!"<<endl;
system("pause");
return;
}
inData.seekg(0,ios::beg);
if(inData.peek()==EOF){
cout<<"通讯录中没有联系人!"<<endl;
return;
}
cout<<"\t姓名\t电话号码\t地址\t\t邮箱\t\tQQ号码"<<endl;
Person p_sh[100];
int i = 0;
int z=1;
char buffer[256];
string record;
while(1){
//inData.read((char*)&p_sh[i],sizeof(p_sh[i]));
if(inData.eof()){
break;
}else{
while(getline(inData,record,'|')){
//cout<<record<<" ";
if(z==5){p_sh[i].setQQ(record);cout<<p_sh[i].getQQ();z=1;i++;}
if(z==4){p_sh[i].setEmail(record);cout<<p_sh[i].getEmail();z++;}
if(z==3){p_sh[i].setAddress(record);cout<<p_sh[i].getAddress();z++;}
if(z==2){p_sh[i].setTel(record);cout<<p_sh[i].getTel();z++;}
if(z==1){p_sh[i].setName(record);cout<<p_sh[i].getName();z++;}
}
}

}
inData.close();
}

void Menu::format(){
cout<<"format"<<endl;
}

void Menu::sort(){
cout<<"sort"<<endl;
}

void Menu::save(){
cout<<"save"<<endl;
}

void main(){
Menu m;
int w = 0;
do{
cout<<" 1.添加联系人 2.删除联系人 3.查询联系人 4.修改信息 "<<endl;
cout<<" 5.按序排列 6.显示通讯录 7.清空通讯录 0.退出通讯录 "<<endl;
cout<<"\t\t\t请选择:";
int select_1;
cin>>select_1;
switch(select_1){
case 1: m.add();break;
case 2: m.del();break;
case 3: cout<<"\t\t1.按姓名查找 2.按电话号码查找 3.返回主菜单"<<endl;
int select_2;
cin>>select_2;
switch(select_2){
case 1: m.find_name();break;
case 2: m.find_tel();break;
case 3: break;
default: cout<<"\t\t\t输入错误"<<endl;
}
break;
case 4: m.alter();break;
case 5: m.sort();break;
case 6: m.show();break;
case 7: m.format();break;
case 0: cout<<"\t\t\t感谢使用"<<endl;w=1;break;
default: cout<<"\t\t\t输入错误"<<endl;
}
}while(w!=1);
}


输入两个人的信息:第一个人对应的信息分别是:123 456 789 123 456
第二个人:a b c d e
然后程序输出到通讯录.dat里显示:123|456|789|123|456|
a|b|c|d|e|
这都没有问题
问题是执行show()读取显示在屏幕上就显示成:
123456789123456456
abcdde

第一个人最后一个信息多显示了一遍;第二个人的一个信息也是;怎么办啊,搜了不少资料,弄了一下午实在没办法了找不出问题,新人求助啊,谢谢了!!
直接用cout<<record<<" ";这个是没问题,但我想把字符串读入数组中然后去处理;例如删除修改功能我想导入到数组中去处理。。。
求助!过几天就要交了。。谢谢!!
...全文
124 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜龍 2013-06-19
  • 打赏
  • 举报
回复
引用 4 楼 u010936098 的回复:
if(z==5)这个分支执行完后,z=1,结果if(z==1)分支又执行了一遍,导致数据重复使用,后面的数据全部移位。 多分支一定不要忘了else。
太感谢啦,解决了!!
橡木疙瘩 2013-06-19
  • 打赏
  • 举报
回复
if(z==5)这个分支执行完后,z=1,结果if(z==1)分支又执行了一遍,导致数据重复使用,后面的数据全部移位。 多分支一定不要忘了else。
橡木疙瘩 2013-06-19
  • 打赏
  • 举报
回复

                if(z==5)     {p_sh[i].setQQ(record);cout<<p_sh[i].getQQ();z=1;i++;}
                else if(z==4){p_sh[i].setEmail(record);cout<<p_sh[i].getEmail();z++;}
                else if(z==3){p_sh[i].setAddress(record);cout<<p_sh[i].getAddress();z++;}
                else if(z==2){p_sh[i].setTel(record);cout<<p_sh[i].getTel();z++;}
                else if(z==1){p_sh[i].setName(record);cout<<p_sh[i].getName();z++;}

zybjtu 2013-06-19
  • 打赏
  • 举报
回复
这边show也没问题。楼主
赵4老师 2013-06-19
  • 打赏
  • 举报
回复
摒弃cout;使用printf。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧