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 es in when the end piece