8.11 本节的程序在外层while循环中定义了 istringstream 对象,如果record对象定义在循环之外,你需要对程序进行怎样的修改?重写程序,将record的定义移到while循环外,验证你设想的修改方法是否正确
struct PersonInfo {
string name;
vector<string> phones;
void printData();
};
void PersonInfo::printData()
{
cout << name << endl;
for (string num : phones)
cout << num << " ";
cout << endl;
}
void p8_11()
{
string line, word; //分别保存来自输入的一行和单词
ifstream ifs("phoneData.txt");
vector<PersonInfo> people; //保存来自输入的所有记录
istringstream record;
//逐行从输入读取数据,直至cin遇到文件尾
while (getline(ifs, line))
{
PersonInfo info;//创建一个保存此记录的对象
record.str(line);//保存一个line的拷贝
record >> info.name;
while (record >> word)
info.phones.push_back(word);
people.push_back(info);
record.clear(); //(重要!!!!!)将流的状态设置为有效
}
for (PersonInfo p : people)
p.printData();
}
8.12 上方代码中我们为什么没有在PersonInfo中使用类内初始化(没搞明白)
因为这里需要聚合类使得用户可以直接访问其成员即可,故不需要在PersonInfo中是yoga类内初始化
8.13 重写本节的电话号码程序,从一个命名文件而非cin读取数据
struct PersonInfo {
string name;
vector<string> phones;
};
//判断号码是否合法
bool valid(const string& str)
{
for (const char& c : str)
if (!isdigit(c)) //判断每个字符是否都是数字
return false;
return true;
}
string format(const string& str)
{
//substr(0,3)表示从下标0开始截取3个字符,即下标0,1,2
return str.substr(0, 3) + "-" + str.substr(3, 3) + "-" + str.substr(6);
}
void p8_13()
{
string line, word; //分别保存来自输入的一行和单词
ifstream ifs("phoneData.txt");
vector<PersonInfo> people; //保存来自输入的所有记录
istringstream record;
//逐行从输入读取数据,直至cin遇到文件尾
while (getline(ifs, line))
{
PersonInfo info;//创建一个保存此记录的对象
record.str(line);//保存一个line的拷贝
record >> info.name;
while (record >> word)
info.phones.push_back(word);
people.push_back(info);
record.clear(); //(重要!!!!!)将流的状态设置为有效
}
//处理无效电话号码
//容器中的每个PersonInfo对象
for (const auto& entry : people) {
ostringstream formatted, badNums; // 每个循环创建的字符串输出流对象,所以不需要用后重置流状态
for (const auto& nums : entry.phones) //对某个人的每个号码
{
if (!valid(nums))
{
badNums << " " << nums;//讲数的字符形式存入badNums字符串流
}
else
{
formatted << " " << format(nums);
}
}
if (badNums.str().empty()) //如果没有错误的号码
{
cout << entry.name << " "
<< formatted.str() << endl;
}
else
{
cerr << "input error:" << entry.name
<< "invalid number(s): " << badNums.str() << endl;
}
}
}
int main()
{
p8_13();
return 0;
}