KWIC

#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值