只是粘贴部分题目的代码,其实本章其它练习的代码也已经被包含其中了。
粘贴了一个.h文件,可以直接拷贝下来用。
#ifndef FUNCTION_8_H_INCLUDED
#define FUNCTION_8_H_INCLUDED
#include<iostream>
#include<fstream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
struct PersonInfo
{
string name;
vector<string> phones;
};
istream& function_8_1(istream&);
void function_8_4(string FILENAME,vector<string>& a);
void function_8_10(string FILENAME, vector<string>& a);
void function_8_11(string FILENAME, vector<PersonInfo>& a);
void function_8_13(string FILENAME, vector<PersonInfo>& a);
istream& function_8_1(istream& in)
{
string s;
while(in>>s)
cout<<s<<endl;
in.clear();
return in;
}
void function_8_4(string FILENAME,vector<string>& a)
{
ifstream in(FILENAME.data());
if(in)
{
cout<<"File has been opened successful!"<<endl;
string temp;
while(in>>temp)
{
a.push_back(temp);
}
}
else
{
cout<<"file couldn't open."<<endl;
}
in.close();
for(vector<string>::size_type i=0;i<a.size();i++)
{
cout<<a[i]<<endl;
}
}
void function_8_10(string FILENAME, vector<string>& a)
{
ifstream iin;
iin.open(FILENAME.data(),ifstream::in);
if(iin)
{
string temp;
while(getline(iin,temp))
{
a.push_back(temp);
}
}
else
{
cerr<<"file couldn't opened."<<endl;
}
iin.close();
for(vector<string>::size_type i=0;i<a.size();i++)
{
istringstream siin(a[i]);
string word;
while(siin>>word)
cout<<word<<endl;
cout<<endl;
}
}
void function_8_11(string FILENAME, vector<PersonInfo>& a)
{
string line,word;
ifstream iin;
istringstream record;
iin.open(FILENAME.data(),ifstream::in);
if(iin)
{
cout<<"File has been opened successful!"<<endl;
while(getline(iin,line))
{
PersonInfo info;
record.clear();
record.str(line);
record>>info.name;
while(record>>word)
info.phones.push_back(word);
a.push_back(info);
}
}
else
{
cerr<<"couldn't open the file"<<endl;
}
iin.close();
for(vector<PersonInfo>::size_type i=0;i<a.size();i++)
{
cout<<a[i].name<<" ";
for(vector<string>::size_type j=0;j<a[i].phones.size();j++)
{
cout<<a[i].phones[j]<<" ";
}
cout<<endl;
}
}
/*
第12题解答:
因为PersonInfo是个聚合类
当一个类满足如下条件时,我们说他是聚合类
1,所有成员都是public的
2,没有定义任何构造函数
3,没有类内初始值
4,没有基类,也没有虚函数
*/
bool valid_8_13(string NUM)
{
if(NUM.size()==11)
return true;
else
return false;
}
void function_8_13(string FILENAME, vector<PersonInfo>& a)
{
ofstream os(FILENAME,ofstream::app);
for(const auto& entry:a)
{
ostringstream validNums;
for(const auto& nums:entry.phones)
{
if(valid_8_13(nums))
validNums<<" "<<nums;
}
if(validNums.str().empty())
{
validNums<<" error phone numbers"<<endl;
}
else
{
os<<endl;
os<<"Name : "<<entry.name<<"\nNumbers : "<<validNums.str()<<endl;
}
}
}
/*
第14题解答:
因为按引用传递不创建副本,所以很好的提升了程序的存储和运行效率,特别适用于
很大的结构体或类等。const保证传入的参数不被改变。
*/
#endif // FUNCTION_8_H_INCLUDED