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