梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
o Binary2Text�此�A console program that is used to convert a binary lottery ticket stream into
a text stream。
o LottoLibrary�此�A class library that contains the definition of the Ticket type that repre
sents a lottery ticket in memory。
249
´´´´´´´´´´´´´´´´´´´´´´Page 272´´´´´´´´´´´´´´´´´´´´´´´
250 CH AP T E R 1 0 * L E A R N I N G A B OU T P E R S IS TE N CE
o ReaderWriter�此�A class library that contains the infrastructure code for processing streams
and mand´line arguments。
o Text2Binary�此�A console program that is used to convert a text lottery ticket stream into a
binary stream。
o TextProcessor�此�A console application that will read and write a text file。 This application
will bee a prototype example of how to write a console´based application。 It
contains a reference to the ReaderWriter class library。
Piping Data Using a Console
Console applications are not very interactive�察�for the most part�察�they are keyboard´based appli
cations。 The main advantage of console applications is their ability to dynamically string data
stream manipulations together�察�a process called piping。
For the lottery´prediction example�察�TextProcessor is a console application that will be fed
data by a pipe and generate data using a pipe�察�as illustrated Figure 10´1。 A file feeds a pipe�察�which
feeds the console application that manipulates the data�察�which then feeds an outgoing pipe
that could be used to feed another console application。
Figure 10´1。 Pipeline approach to processing
TextProcessor will read a file of lottery numbers�察�clean them up ��for example�察�by removing
empty lines of text���察�and remove any duplicates。 The console program will not worry about how
the data is used。 The main focus of TextProcessor is to read data�察�clean it up�察�and write out
semantically correct data。
Reading Data from the Console
Reading data from the console can happen in two ways�此�
o Supply the path of the file to be read to the application as a console argument。
o Pipe the data from another application to the console application。
Our example will be able to accept data streams in both ways。
´´´´´´´´´´´´´´´´´´´´´´Page 273´´´´´´´´´´´´´´´´´´´´´´´
CH A PT E R 1 0 * L E A R N I N G A B O U T P E R S IS T E N CE 251
Reading from a File
Reading from a file is programmatically the simplest way of obtaining the data。 In our case�察 �
we¨ll use a mand´line argument to get the file¨s name。 For example�察�to simply load a file
named lotto。txt into the TextProcessor program�察�the mand line is as follows�此�
TextProcessor。exe lotto。txt
A single mand´line parameter�察 �lotto。txt�察�is passed as a string to TextProcessor。exe。
mand´line arguments are separated from each other using spaces。 In the context of Windows�察 �
this is a problem�察�because paths can contain spaces。 For example�察�the following mand line
would be passed as two mand´line arguments。
TextProcessor。exe c��My Documentsuserlotto。txt
The space between My and Documents tells the console that there are two arguments。 To fix
that problem�察�you need to enclose the path in quotation marks�此�
TextProcessor。exe ;c��My Documentsuserlotto。txt;
The mand line may also include additional parameters�察�as in this example�此�
TextProcessor。exe ´count 10 lotto。txt
The parameter ´count expects a value�察�which is 10 in this example。 Traditionally�察�options
are specified using key/value pairs�察�because console applications allow the options to be placed
in any order。 The exception is the last argument�察�which is usually the data on which to operate。
*Note For more information about the permutations and binations of mand lines�察�and what a
console can do�察�see http��//en。wikipedia。org/wiki/mand_line_interface。
Piping Data
Another solution is to use a mand that reads the file and pipes the contents of the file to
a stream。 The console application reads the stream and processes the data。 The following is
an example of a mand line that pipes data。 The pipe operation is indicated by the pipe
character �─。���。
type lotto。txt �� TextProcessor。exe
In the example�察�the mand type�察�which ordinarily reads a file and displays it on the
console�察�reads in the lotto。txt file and pipes it to the console。 Then TextProcessor。exe reads
from the console�察�processes the data�察�and pipes it back to the console。
´´´´´´´´´´´´´´´´´´´´´´Page 274´´´´´´´´´´´´´´´´´´´´´´´
252 CH AP T E R 1 0 * L E A R N I N G A B OU T P E R S IS TE N CE
For the scope of the TextProcessor application�察�the mand lines listed in Table 10´1
are valid。
Table 10´1。 TextProcessor mand Lines
mand Description
TextProcessor。exe Without any arguments�察�the data will be read from the console
pipe and written back to the console pipe。
TextProcessor。exe ��filename�А �Using one argument�察�the data will be read from the specified
file and written to the console pipe。
TextProcessor。exe ´out Using the ´out parameter with two arguments�察�the first file
��filename�А。�filename�А �specified is where the data will be written�察�and the last file
specified is the file to read。
TextProcessor。exe ´out Using the ´out parameter with one argument�察�the data is read
��filename�А �from the console pipe and written to a file。 Notice that the
output file name is explicitly defined�察�otherwise�察�if a single
identifier is given�察�the console application would not know
whether you are reading or writing to a file。
TextProcessor。exe ´help Outputs to the console how to use TextProcessor。 The help is
also generated when the parameters are specified incorrectly。
Building a Shell
Implementing TextProcessor from an architectural perspective involves writing two pieces of
code�此�a module to read/write to a stream and a module to process the stream。 By separating the
two modules�察�the processor is not dependent on where the data originated。 This also allows the
developer to define an interface that is implemented to process the data。
Assembling the Pieces Using an Echo Program
The lottery´prediction program is a case where I know something about the topic�察�but not all
the details。 Developing code is a constant challenge of figuring out which APIs to use。 In this
type of situation�察�so that I don¨t get bogged down in API hunting�察�I first assemble all of the pieces
I need for the application。 I develop what I call an echo program。 An echo program has all of its
pieces in place�察�and when called will seem like it functions。 The echo part