C++primer plus第六版课后编程题答案17.5

main175.cpp

不知道为什么,文件追加不成功,都是只能更新,知道的麻烦告诉下我

#include <iostream>
#include <set>
#include <algorithm>
#include <string>
#include <iterator>
#include <fstream>
#include <cctype>
using namespace std;
//由题知道,键值唯一,可以知道,应该用set
static void output(string str)
{
	cout<<str<<"  ";
};
static bool check(ifstream &fcheck,string &str)//检测文件中是否已经存在该名字
{
	string checkstr;
	int flag; 
	//
	int sizestr;
	int sizecheck;
	sizestr=str.length();

	while(fcheck.good())
	{
		//getline(fcheck,checkstr);//多1个长度
		//getline(fcheck,checkstr,'\n');//多1个长度
		fcheck>>checkstr;//这样才保证长度正确,应该是因为输入的时候用的是cin>>
		sizecheck=checkstr.length();//这里的为什么会多1个长度,getline?
		flag=str.compare(checkstr);//(str==checkstr);//为何总返回-1??
		if(flag==0)						//忘记了str的是地址,不能直接比较,比较的是地址!!
			return true;
	}
	if(fcheck.eof())
		return false;


};
static bool writeToSet(ifstream &fwrite,set<string> &s)
{
	string str;
	while(fwrite.good())
	{
		//getline(fwrite,str);//不要用这个,会把文件最后一个换行读进去
		fwrite>>str;
		s.insert(str);
	}
	if(fwrite.eof())
		return true;
	else
		return false;
}
/*
static bool input(ofstream &fout,const char *filename)
{
	ifstream fcheck;
	string temp;
	cout<<"plesase enter your friends name(q to quit):";
	cin>>temp;
	while(temp!="q")
	{
		//Mat.insert(Mat.begin(),temp);
		fcheck.open(filename,ios_base::binary);//流重定位
		if(check(fcheck,temp))//如果已经存在
		{
			cout<<"\nYou had already writer it!Enter others name:"<<endl;
			
		}
		else//否则写入
		{
			fout<<temp;
			fout<<endl;
			cout<<"\nwrite success!"<<endl;
		}
		fout.flush();//刷新流,写入
		fcheck.close();
		cout<<"\nMat ,plesase enter your friends name continue(q to quit):";
		cin>>temp;
	}
	while(cin.get()!='\n')
		continue;
	return true;
}

*/

static bool save(set<string> &s)
{
	//ofstream fout("All.dat",ios_base::binary||ios_base::app);//追加模式//为何不是直接在文件尾部追加呢?
	ofstream fout("All.dat",ios_base::ate||ios_base::app);
	if(!fout.is_open())
	{
		cout<<"Open All.dat error!"<<endl;
		return false;
	}
	set<string>::iterator it;
	for(it=s.begin();it!=s.end();++it)
	{
		fout<<*it;
		//fout<<"  ";
		fout<<endl;//<<忽略end??
		fout.flush();
	}
	fout.close();
	return true;

}


void main175()
{
	ofstream foutM("Mat.dat",ios_base::binary||ios_base::app);//追加模式
	ofstream foutP("Pat.dat",ios_base::binary||ios_base::app);//需文件已存在,否则无法以追加打开
	ifstream fcheck;
	ifstream fwrite;

	if(!foutM.is_open())
		cout<<" Mat.dat open failure!"<<endl;
	if(!foutP.is_open())
		cout<<" Pat.dat open failure!"<<endl;

	//input(foutM,"Mat.dat");
	//初始化Mat.dat文件
	
	string temp;
	cout<<"Mat ,plesase enter your friends name(q to quit):";
	cin>>temp;
	while(temp!="q")
	{
		//Mat.insert(Mat.begin(),temp);
		fcheck.open("Mat.dat",ios_base::binary);//流重定位
		if(check(fcheck,temp))//如果已经存在
		{
			cout<<"\nYou had already writer it!Enter others name:"<<endl;
			
		}
		else//否则写入
		{
			foutM<<temp;
			foutM<<endl;
			cout<<"\nwrite success!"<<endl;
		}
		foutM.flush();//刷新流,写入
		fcheck.close();
		cout<<"\nMat ,plesase enter your friends name continue(q to quit):";
		cin>>temp;
	}
	while(cin.get()!='\n')
		continue;






	set<string> Mat;
	set<string> Pat;

	fwrite.open("Mat.dat",ios_base::binary);

	if(writeToSet(fwrite,Mat))
			cout<<"\nwrite to Mat success!"<<endl;
	else
			cout<<"Something wrong!"<<endl;
	fwrite.close();

	cout<<"Mat's friend list: ";
	for_each(Mat.begin(),Mat.end(),output);

	//Pat.dat
	
	cout<<"\nNow ,Pat ,please enter your friend's name:";
	cin>>temp;
	while(temp!="q")
	{
		//Mat.insert(Mat.begin(),temp);
		fcheck.open("Pat.dat",ios_base::binary);//流重定位
		if(check(fcheck,temp))//如果已经存在
		{
			cout<<"\nYou had already writer it!Enter others name:"<<endl;
			
		}
		else//否则写入
		{
			foutP<<temp;
			foutP<<endl;
			cout<<"\nwrite success!"<<endl;
		}
		foutP.flush();//刷新流,写入
		fcheck.close();
		cout<<"\nMat ,plesase enter your friends name continue(q to quit):";
		cin>>temp;
	}
	while(cin.get()!='\n')
		continue;

	fwrite.open("Pat.dat",ios_base::binary);

	if(writeToSet(fwrite,Pat))
			cout<<"\nwrite to Pat success!"<<endl;
	else
			cout<<"Something wrong!"<<endl;
	fwrite.close();

	cout<<"Pat's friend list: ";
	for_each(Pat.begin(),Pat.end(),output);

	set<string> All;
	//transform(Mat.begin(),Mat.end(),All.begin(),[](set<string>::iterator it){return it;});//
	//set_union(Mat.begin(),Mat.end(),Pat.begin(),Pat.end(),All.begin());//用set_union
	set_union(Mat.begin(),Mat.end(),Pat.begin(),Pat.end(),insert_iterator<set<string> >(All,All.begin()));//p703
	cout<<"\nAll list:";
	for_each(All.begin(),All.end(),output);
	cout<<endl;
	if(save(All))
		cout<<"Save perfer!"<<endl;
	cin.get();
	cin.get();


}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值