首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++遍历数组有关问题!新手!

2013-06-26 
c++遍历数组问题!急!!!新手求助!!还是通讯录的问题。。。#includeiostream#includefstream#includestdli

c++遍历数组问题!急!!!新手求助!!
还是通讯录的问题。。。

#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了!!
先跪谢各位大神了!! c++ 数组
[解决办法]
你用'
[解决办法]
'作为分隔符调用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++;
   }


[解决办法]
推荐使用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);

热点排行