本章内容讲了C#代码实现管道流的详细过程,通过管道流读取文件,然后对文件进行移位操作,最后将其回写入管道流
源代码详见github
https://github.com/zhazhalin/HDWK.git
1. 问题描述:
(1)input.txt文本文件存放多行字符串;
(2)每行字符串由多个单词组成;每个单词由空格分隔做如下操作:
(3)系统从文本文件中读入字符串
(4)对每个字符串中的单词进行循环移位操作
如:i love you 移位后 存在如下字符串
i love you
love you i
you I love
(5) 对移位后的所有字符串进行按字母排序
(6) 将排序后的所有字符串输出到 另一个文本文件output.txt中
2. 管道-过滤器建模
将问题抽象为管道和过滤器
Filters:
– Input filter (“输入”过滤器:从数据源读取输入文件,解析格式,将行写入输出管道)
– CircularShifter filter (“循环移位”过滤器)
– Alphabetizer filter (“排序”过滤器)
– Output filter (“输出”过滤器)
Pipe:
– in_cs pipe
– cs_al pipe
– al_ou pile
类图:
3.代码实现
A. 先建立一个控制台项目
B.添加 Pipe.cs 类文件
Pipe代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KWIC
{
public class Pipe
{
Queue<String> q1;
public Pipe()
{
//实现 对 q1 初始化 即 分配空间
q1=new Queue<string>();
}
public void Write(String str1) //将str1写入管道中
{
//将str1加入到q1队列中,进行入队操作
q1.Enqueue(str1);
}
public String Read() //从管道中读取一个字符串
{
//当q1队列中元素个数>0时,调用q1的出队方法 将字符串存入st中
String st = null;
if (!Empty())
{
st=q1.Dequeue();
}
return st;
}
public Boolean Empty() //判断管道是否为空,如果为空返回 true,否则 返回false
{
Boolean b = true;
//判断 q1队列是否为空
if (q1.Count > 0)
{
return false;
}
return b;
}
}
}
C.完成 上面的代码后,建立 Filter.cs 类文件 并建立 Filter抽象类
代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace KWIC
{
public abstract class Filter
{
protected Pipe inpipe;
protected Pipe outpipe;
public Filter()
{
}
public Filter(Pipe pipeinput, Pipe pipeoutput)
{
//构造函数对 inpipe和outpipe 初始化
this.inpipe = pipeinput;
this.outpipe = pipeoutput;
}
public abstract void transform(); //抽象函数 完成过滤器的处理
public void run()
{
try
{
transform();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
D.建立Filter类的派生类 Input_Filter.cs文件,并建立派生类 Input_Filter
代码如下
using System;
using System.Collections.Generic;
using System.IO;
using System