Chapter 8 - Object Oriented Programming

Download Report

Transcript Chapter 8 - Object Oriented Programming

Chapter 8:
Streams and Files
Problem Solving,
Abstraction, and Design using C++ 6e
by Frank L. Friedman and Elliot B. Koffman
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
8.1 Standard Input/Output
Streams
• A stream is a sequence of characters
• Standard input stream (cin) and standard output
stream (cout) of the iostream library
• Streams convert internal representations to
character streams or vice versa
• >> input (extraction) operator
• << output (insertion) operator
• Any character (printable or not)
• A stream has no fixed size
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
2
Input Stream, >> Operator
• Last character read is kept track using an input
stream buffer pointer
• Each new input attempt begins at current pointer
position
• Leading white space (blanks, tab, nwln) skipped
until first non-white-space character is located
cin >> ch;
• For numeric value, all characters that are part of
the numeric value are processed until a character
that’s not legally part of a C++ number is read.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
3
Reading One Character at a
Time
• Can also read/write white space
– iostream functions get and put
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
4
Listing 8.2
Processing individual characters in a stream
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
5
Listing 8.2
Processing individual characters in a stream
(continued)
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
6
Table 8.1
The File Manipulation Member Functions
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
7
Using a Stream in a Condition
cout << “Enter a line or press “ << ENDFILE << “: “;
while (cin.get(next))
// get first char of new line
{
// insert loop body including inner while loop
...
cout << “Enter a line or press “ << ENDFILE << “: “;
} // end outer while
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
8
8.2 External Files
• Interactive
– Expect user input from keyboard
– Ok for smaller programs
• Batch
–
–
–
–
–
–
Requires use of data files (save to disk)
Don’t expect input from keyboard, so no prompts
Often uses echo printing of input
Input file can be read many times
Can also write output to file
Output file from one program can be input to another
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
9
Directory Names for External
Files
• Must know location of file within directory
structure (pathname)
• Directories are system dependent
• File names usually follow system and local
conventions
– how file is named
– use of extensions
• .cpp .dat .doc .txt
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
10
Attaching Streams to External
Files
• Declaring a stream object
ifstream ins;
ofstream outs;
• External (physical) file name linked to internal
(logical) name by open function
#define inFile “InData.txt”
...
ins.open(inFile);
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
11
Reading a File Name
string fileName;
cout << “Enter the input file name: “;
cin >> fileName;
ins.open(fileName.c_str( ));
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
12
Case Study: Preparing a Payroll File
• Write a program that reads a data file
consisting of employee salary data, and
computes the employee’s gross salary. It
writes the employee’s name and gross
salary to an output file and accumulates the
gross salary amount in the total company
payroll, which it also displays.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
13
Case Study: Sample Files
• Input
Jim Baxter
35.5
7.25<nwln>
Adrian Cybriwsky
Ayisha Mertens
40.0
20.0
6.50<nwln>
8.00<nwln>
• Output
Jim Baxter
257.38<nwln>
Adrian Cybriwsky
Ayisha Mertens
260.00<nwln>
160.00<nwln><eof>
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
14
Case Study: Problem Analysis
• Streams Used
– ifstream eds
– ofstream pds
// employee data info
// payroll data info
• Problem Input (from stream eds)
– for each employee
•
•
•
•
string firstName
string lastName
float hoursWorked
float hourlyRate
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
15
Case Study: Problem Analysis
• Problem Output (to stream pds)
– for each employee
• string firstName
• string lastName
• float salary
• Problem Output (to stream cout)
– float totalPayroll
// total company payroll
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
16
Case Study: Program Design
• Algorithm for function main
1. Prepare streams and associated files for
processing
2. Process all employees and compute payroll
total (function processEmp).
3. Display the payroll total.
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
17
Case Study: Interface for
processEmp
• Input Arguments
– ifstream eds // input stream - employee data
– ofstream pds // output stream - payroll data
• Output Arguments
– none
• Function Return Value
– float totalPayroll
// total company payroll
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
18
Case Study: Algorithm for
processEmp
1. Initialize payroll total to 0.0
2. While there are more employees
2.1 Read employee’s first and last names
and salary data from eds
2.2 Compute employee’s salary
2.3 Write employee’s first and last
names and salary to pds; add it to payroll
total
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
19
Listing 8.5
Implementation of processEmp
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
20
Listing 8.5
Implementation of processEmp (continued)
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
21
8.4 More on Reading String Data
• getline (istream& ins, string& str)
• getline (istream& ins, string& str, char delimiter)
• ins.ignore (int n, char delimiter)
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
22
Using getline
• getline - could be used to process an entire
line of data
• E.g. for data file containing
Jim Andrew Baxter#
Adrian Cybriwsky#
Ayisha W. Mertens#
35.5
40.0
20.0
7.25<nwln>
6.50<nwln>
8.00<nwln>
• Use # as a delimiter character
getline (eds, name, ‘#’);
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
23
Using ignore
• getline does not skip leading white space,
so if a newline character is encountered at
the beginning of the characters to be
extracted, getline will stop immediately and
won’t perform the expected task
• E.g. data file contains
Jim Andrew Baxter<nwln>
35.5
7.25<nwln>
Adrian Cybriwsky <nwln>
40.0
6.50 <nwln>
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
24
payroll = 0.0;
getline(eds, name);
while (!eds.eof( ))
{
eds >> hours >> rate;
salary = hours * rate;
pds << name << “ “ << salary << endl;
payroll += salary;
eds.ignore(100, ‘\n’);
getline(eds, name);
}
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
25
Table 8.3
Input/Output Manipulators
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
26
Manipulators Example
cout << “The value of x is “
<< fixed
<< showpoint
<< setprecision(4) << x << endl;
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
27
8.6 Common Programming Errors
•
•
•
•
Connecting streams and external files
Using input and output streams incorrectly
Reading past the end of a file
Matching data in an input stream to input
data stores
• White space and input
• Proper handling of the newline character
• Input and output settings
Copyright © 2007 Pearson Education, Inc. Publishing as Pearson Addison-Wesley
28