#include<stdio.h>
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<fstream>
#include<string.h>
#include<algorithm>using namespace std;
class Filter;
class Pipe
{
friend class Filter;
friend class InputFilter;
friend class Shift_Filter;
friend class Sort_Filter;
friend class Store_Filter;
private:
vector<string> buf;
};
class Filter
{
protected:
Pipe input_Pipe; //输入管道
Pipe output_Pipe; //输出管道
public:
virtual void Transform()=0; //将输入管道的数据流改造后放入输出管道
void ReadIn(const Filter& f ) //从相邻过滤器中输出管道中读取数据放入本地过滤器的输入管道
{
vector<string>::const_iterator it=f.output_Pipe.buf.begin();
for(;it!=f.output_Pipe.buf.end();it++)
{
input_Pipe.buf.push_back(*it);
}
}
};
class Shift_Filter;
class InputFilter:public Filter
{
friend class Shift_Filter;
public:
void ReadIn();
void Transform();
};
void InputFilter::ReadIn()
{
string filename; //要打开的文件名
string line,word; //line用于读取文件中每一行,word代表读取每一个单词
bool suc=false; //suc代表操作是否成功
while(!suc)
{
cout<<"请输入文本文件名:";
cin>>filename;
fstream file(filename.c_str()); //定义文件流对象
if(!file)
{
cout<<"输入的文件不存在!"<<endl;
}
else
{
cout<<"文件打开成功!"<<endl;
while(getline(file,line))
{
input_Pipe.buf.push_back(line); //将每行句子输入管道
}
suc=true;
file.close();
}
}
}
void InputFilter::Transform()
{
vector<string>::iterator it;
for(it=input_Pipe.buf.begin();it!=input_Pipe.buf.end();it++)
{
output_Pipe.buf.push_back(*it);
}
}class Sort_Filter;
class Shift_Filter:public Filter
{
friend class Sort_Filter;
public:
void Transform();
};void Shift_Filter::Transform()
{
int cnt; //每一行空格数
int i,j;
string temp;
vector<string>::iterator it;
for(it=input_Pipe.buf.begin();it!=input_Pipe.buf.end();it++)
{
cnt=0;
string line=*it;
for(i=0;line[i];i++)
{
if(line[i]==' ') cnt++;
}
int k;
for(k=0;k<=cnt;k++) //将line循环移位
{
string temp;
for(i=0;line[i]!=' ';i++) temp+=line[i];
i++;
j=0;
while(line[i])
{
line[j++]=line[i++];
}
line[j++]=' ';
for(i=0;temp[i];i++) line[j++]=temp[i];
output_Pipe.buf.push_back(line);
}
}
cout<<"循环移位后的英文句子是:"<<endl;
for(it=output_Pipe.buf.begin();it!=output_Pipe.buf.end();it++)
{
cout<<*it<<endl;
}
}
class Store_Filter;
class Sort_Filter:public Filter
{
friend class Store_Filter;
public:
void Transform();
};
//函数对象
class LessThen
{
public:
bool operator()(const string& one,const string& other) //one小于other返回true,否则返回false;
{
stringstream ss1(one),ss2(other);
string word1,word2;
while(ss1>>word1 && ss2 >>word2)
{
if(word1<word2) return true;
else if(word1>word2) return false;
else continue;
}
if(!ss1 && !ss2) return false;
else if(!ss1) return true;
else return false;
}
};void Sort_Filter::Transform()
{
sort(input_Pipe.buf.begin(),input_Pipe.buf.end(),LessThen());
vector<string>::const_iterator it;
cout<<"排序后的英文句子是:"<<endl;
for(it=input_Pipe.buf.begin();it!=input_Pipe.buf.end();it++)
{
output_Pipe.buf.push_back(*it);
cout<<*it<<endl;
}
}
class Store_Filter:public Filter
{
public:
Store_Filter():storefile(0)
{
}
void Transform();
FILE *getFile() const
{
return storefile;
}
private:
FILE *storefile; //用于存储数据流的文件指针
};
void Store_Filter::Transform()
{
string filename;
cout<<"请输入要写入数据的文本文件名(*.txt)"<<endl;
cin>>filename;
storefile=fopen(filename.c_str(),"w+");
if(!storefile)
{
cout<<"文件创建失败!"<<endl;
return;
}
string line;
vector<string>::const_iterator it;
for(it=input_Pipe.buf.begin();it!=input_Pipe.buf.end();it++)
{
fprintf(storefile,(*it).c_str());
fprintf(storefile,"\n");
}
cout<<"写入成功!"<<endl;
fclose(storefile);
}
void main()
{
InputFilter input;
input.ReadIn();
input.Transform();
Shift_Filter ff;
ff.ReadIn(input);
ff.Transform();
Sort_Filter sf;
sf.ReadIn(ff);
sf.Transform();
Store_Filter storef;
storef.ReadIn(sf);
storef.Transform();
}