奇怪,问题何在?
当families.txt内无内容时候,可以编译、查询[当然,什么也差不到],但是,如果加入内容,奇怪,怎么就没有反应了???望指教......
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <map>
using namespace std;
typedef vector<string> vstring;
map<string,vstring> families;
//读取文件,并将内容置入map中
void populate_map(ifstream &nameFile,map<string,vstring> &families)
{
string textline;
while(getline(nameFile,textline))
{
string fam_name;
vector<string> child;
string::size_type pos=0,prev_pos=0,text_size=textline.size();
while(pos=textline.find_first_of(' ',pos)!=string::npos)
{
//计算子字符串的终点
string::size_type end_pos=pos-prev_pos;
//如果prev_pos未设值或其值为0,那么读到的单词就家庭姓氏
//否则就一一读取孩子的名字
if(!prev_pos)
fam_name=textline.substr(prev_pos,end_pos);
else
child.push_back(textline.substr(prev_pos,end_pos));
prev_pos=++pos;
}
//处理最后一个孩子的名字
//if(prev_pos<text_size)
// child.push_back(textline.substr(prev_pos,pos-prev_pos));
if ( prev_pos < text_size )
if( prev_pos )
//如果做过循环,则prev_pos不为0,就处理最後一个孩子
child.push_back(textline.substr(prev_pos,pos-prev_pos));
else
fam_name = textline.substr( prev_pos, pos - prev_pos );
//prev_pos为0,说明该家庭无孩子,处理家庭名
if(!families.count(fam_name))
families[fam_name]=child;
else
cerr<<"Oops! We already have a"
<<fam_name<<' '
<<"family in our map!\n";
}
}
//用户查询
void query_map(const string &family,const map<string,vstring> &families)
{
map<string,vstring>::const_iterator it=families.find(family);
if(it==families.end())
{
cout<<"Sorry. The"<<family<<' '
<<"is not currently entered.\n";
return ;
}
cout<<"The"<<family;
if(!it->second.size())
cout<<"has no children.\n";
else
{
//打印出vector内所有小孩的名字
cout<<"has"<<it->second.size()<<"children:";
vector<string>::const_iterator iter=it->second.begin(),end_iter=it->second.end();
while(iter!=end_iter)
{
cout<<*iter++<<" ";
++iter;
}
cout<<endl;
}
}
//显示map内容
void display_map(const map<string,vstring> &families,ostream &os)
{
map<string,vstring>::const_iterator it=families.begin(),end_it=families.end();
while(it!=end_it)
{
os<<"The"<<it->first<<"family";
if(it->second.empty())
os<<"has no children.\n";
else
{
//打印出vector内所有小孩的名字
os<<"has"<<it->second.size()<<"children: ";
vector<string>::const_iterator iter=it->second.begin(),end_iter=it->second.end();
while(iter!=end_iter)
{
os<<*iter<<" ";
++iter;
}
os<<endl;
}
++it;
}
}
int main()
{
map<string,vstring> families;
ifstream nameFile("F:\\Test\\families.txt");
if(!nameFile)
{
cerr<<"Unable to find families.txt file.Bailing out! \n";
return -1;
}
populate_map(nameFile,families);
string family_name;
while(1)
{
cout<<"Please enter a family name or q to quit:";
cin>>family_name;
if(family_name=="q")
break;
query_map(family_name,families);
}
display_map(families,cout);
system("pause");
return 0;
}