c++遍历数组问题!急!!!新手求助!!

夜龍 2013-06-19 11:19:54
还是通讯录的问题。。。
#include<iostream>
#include<fstream>
#include<stdlib.h>//sys
#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<<setiosflags(ios::left)<<n<<"|"<<t<<"|"<<a<<"|"<<e<<"|"<<Q<<"|"<<endl;
outData.close();
}

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

void Menu::find_name(){
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<<"请输入需要查询的联系人姓名:";
string findname;
cin>>findname;
Person p_fn[100];
int i = 0;
int z = 1;
string record;
while(1){
if(inData.eof()){
bool flag = false;
for(int j=0;j<100;j++){
if(p_fn[j].getName()==findname){
cout<<"\t姓名\t电话号码\t地址\t\t邮箱\t\tQQ号码"<<endl;
cout<<"\t"<<p_fn[j].getName()<<"\t"<<p_fn[j].getTel()<<"\t"<<p_fn[j].getAddress()<<"\t"<<p_fn[j].getEmail()<<"\t"<<p_fn[j].getQQ()<<endl;
flag = true;
}
}
if(flag==false)
cout<<"您查询的联系人不存在!!"<<endl;
break;
}else{
while(getline(inData,record,'|')){
if(z==5){p_fn[i].setQQ(record);z=1;i++;}
else if(z==4){p_fn[i].setEmail(record);z++;}
else if(z==3){p_fn[i].setAddress(record);z++;}
else if(z==2){p_fn[i].setTel(record);z++;}
else if(z==1){p_fn[i].setName(record);z++;}
}
}
}
inData.close();
}

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;
string record;
while(1){
if(inData.eof()){
break;
}else{
while(getline(inData,record,'|')){
if(z==5){p_sh[i].setQQ(record);cout<<"\t"<<p_sh[i].getQQ();z=1;i++;}
else if(z==4){p_sh[i].setEmail(record);cout<<"\t"<<p_sh[i].getEmail();z++;}
else if(z==3){p_sh[i].setAddress(record);cout<<"\t"<<p_sh[i].getAddress();z++;}
else if(z==2){p_sh[i].setTel(record);cout<<"\t"<<p_sh[i].getTel();z++;}
else if(z==1){p_sh[i].setName(record);cout<<"\t"<<p_sh[i].getName();z++;}
}
}
}
inData.close();
}

void Menu::format(){
remove("通讯录.dat");​}

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);
}

只实现了增加,显示,清空三个功能;问题出现在按姓名查找中;
当输入多个联系人资料后,显示都没有问题,但是按姓名查找的话;只能查找到第一个联系人,除了第一个联系人之后的人都找不出来,新手求助!!苦想了一晚上,实在找不出来了,急S了!!
先跪谢各位大神了!!
...全文
186 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
夜龍 2013-06-20
  • 打赏
  • 举报
回复
引用 1 楼 u010936098 的回复:
你用'|'作为分隔符调用getline,这个分隔符会被自动抛弃,但换行符就被保留了下来。除了第一个名字以外,其它所有的名字前面都多了一个换行符。 比较好的方法是以缺省分隔符调用getline,每次读取一行,然后再以’|'作为分隔符拆分读出来的字符串。如果不想写拆分算法,可以用读出来的字符串构造一个stringstream,然后再对这个stream调用getline。 在目前的代码的基础上,最简单的修改方法是改121行:

   else if(z==1){
      //删除name前面的换行符
      while(record[0] == '\n' ){
         record.erase(0,1);
      }
      p_fn[i].setName(record);z++;
   }

大神啊!!太感谢了!!上次就是你解决的,多谢!怕是接下来再写别的函数再遇到问题还请您多多指教!!多谢!! 顺便再问下:我那个show()里显示出来倒是没问题,就是第一个联系人是调好了对齐的,之后的联系人就都从最左边开始了,和第一个联系人的信息对不齐了,很难看,怎么改呀?多谢!!!
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
你用'|'作为分隔符调用getline,这个分隔符会被自动抛弃,但换行符就被保留了下来。除了第一个名字以外,其它所有的名字前面都多了一个换行符。 比较好的方法是以缺省分隔符调用getline,每次读取一行,然后再以’|'作为分隔符拆分读出来的字符串。如果不想写拆分算法,可以用读出来的字符串构造一个stringstream,然后再对这个stream调用getline。 在目前的代码的基础上,最简单的修改方法是改121行:

   else if(z==1){
      //删除name前面的换行符
      while(record[0] == '\n' ){
         record.erase(0,1);
      }
      p_fn[i].setName(record);z++;
   }

赵4老师 2013-06-20
  • 打赏
  • 举报
回复
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了 对齐用 printf("%20s",s); printf("%-20s",s);
橡木疙瘩 2013-06-20
  • 打赏
  • 举报
回复
同样的原因,第二个以后的联系人姓名都以换行开始,所以在最左边。

64,662

社区成员

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

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