CIS162AB - C++ - Mesa Community College

Download Report

Transcript CIS162AB - C++ - Mesa Community College

CIS162AB - C++
File Processing
Juan Marquez
06_file_processing.ppt
Overview of Topics
•
•
•
•
•
•
•
Information Processing Cycle
File Processing
Introduce classes and objects
Formatting Output
Character Functions
ASCII Table
Switch Statement
CIS162AB
2
Hardware Model
CPU
Input Devices
Memory (RAM)
To this point we have been using the
keyboard for input and the screen for output.
Both of these are temporary.
CIS162AB
Output Devices
Storage Devices
3
Information Processing Cycle
Input
Raw Data
Process
(Application)
Output from one process can
serve as input to another process.
Output
Information
Storage
Storage is referred to as secondary
storage, and it is permanent storage.
Data is permanently stored in files.
CIS162AB
4
Input and Output (I/O)
• In the prior assignments, we would enter the test
data and check the results. If it was incorrect, we
would change the program, run it again, and re-enter
the data.
• For the sample output, if we didn’t copy it when it
was displayed, we had to run it again.
• Depending on the application, it may be more
efficient to capture the raw data the first time it is
entered and store in a file.
• A program or many different programs can then read
the file and process the data in different ways.
• We should capture and validate the data at its points
of origination (ie cash register, payroll clerk).
CIS162AB
5
File I/O handled by Classes
• Primitive data types include int, double, char, etc.
• A class is a data type that has data (variables and values)
as well as functions associated with it.
• The data and functions associated with a class are
referred to as members of the class.
• Variables declared using a class as the data type are
called objects.
• We’ll come back to these definitions as we go through an
example.
• Sequential file processing – processing the records in
the order they are stored in the file.
CIS162AB
6
Example Scenario
• We have a file named infile.txt
• The file has 2 records with hours and rate.
• We want to process the file by
– reading the hours and rate
– calculating gross pay
– and then saving the results to outfile.txt
CIS162AB
7
infile.txt
40 10.00
50 15.00
• This would be a simple text file.
• The file can be created with Notepad or
some other text editor.
• Just enter two values separated by
whitespace and press return at the end
of each record.
CIS162AB
8
fstream
• We have been using #include <iostream> because this
is where cin and cout are defined.
• We now need to #include <fstream> because this is
where the commands to do file processing are defined.
• fstream stands for File Stream.
• We can have input and output file streams, which
are handled by the classes ifstream and ofstream.
• Recall that a stream is a flow characters.
– cin is an input stream.
– cout is output stream.
CIS162AB
9
Sample Program
#include <iostream>
#include <fstream>
using namespace std;
void main ( )
{
int
hours;
double rate, gross;
ifstream inFile;
ofstream outFile;
CIS162AB
// cin and cout
// file processing
//declares and assigns a
//variable name to a stream
10
Open Function
ifstream inFile;
//ifstream is the class (data type)
//inFile is the object (variable)
inFile.open(“infile.txt”);
//open is a function associated with the object inFile
//open has parenthesis like all functions ( )
//The function call to open is preceded by the object
name and dot operator.
//We pass open( ) an argument (external file name).
CIS162AB
11
Internal and External File Names
ifstream inFile;
inFile.open(“infile.txt”);
•
•
•
•
inFile is the internal file name (object).
infile.txt is the external file name.
open connects the internal name to the external file.
Naming conventions for the external file names vary by
Operating Systems (OS).
• Internal names must be valid C++ variable names.
• In the open is the only place we see the external name.
CIS162AB
12
Check if Open was Successful
• after calling open ( ), we must
check if it was successful by using fail().
if ( inFile.fail() )
//Boolean
{
cout << “Error opening input file…”;
exit (1);
//<cstdlib>
}
CIS162AB
13
Open outfile.txt
outFile.open(“outfile.txt”);
if ( outFile.fail() )
{
cout << “Error opening output file…”;
exit (1);
}
CIS162AB
14
Quick Review
void main ( )
{
int hours;
double rate, gross;
ifstream inFile;
ofstream outFile;
inFile.open(“infile.txt”);
if ( inFile.fail() )
{
cout << “Error …”;
exit (1);
CIS162AB
}
outFile.open(“outfile.txt”);
if ( outFile.fail() )
{
cout << “Error…”;
exit (1);
}
15
Recall infile.txt?
40 10.00
50 15.00
• Recall that we are processing infile.txt.
• The next slide shows the while loop.
• The two values have been entered separated
by whitespace and there is carriage return at
the of each record (also whitespace).
CIS162AB
16
Process the file
inFile >> hours >> rate; // read first record
// cin >> hours >> rate; //same extractors
infile.txt
40 10.00
while (! inFile.eof() )
50 15.00
{
eof
gross = hours * rate;
outFile << hours << rate << gross << endl; //write
// cout << hours << rate << gross << endl;
inFile >> hours >> rate;
//read next record
}
CIS162AB
17
outfile.txt
40 10.00 400.00
50 15.00 750.00
• Assumes decimal formatting was applied.
CIS162AB
18
Close Files
inFile.close( );
outFile.close( );
• Release files to Operating System (OS).
• Other users may get file locked error.
• Good housekeeping.
CIS162AB
19
while vs do-while
inFile >> hours >> rate;
while (! inFile.eof() )
{
gross = hours * rate;
outFile << hours << rate
<< gross << endl;
inFile >> hours >> rate;
}
CIS162AB
Outfile.txt
40 10.00 400.00
50 15.00 750.00
50 15.00 750.00
do
{
inFile >> hours >> rate;
gross = hours * rate;
outFile << hours << rate
<< gross << endl;
} while (! inFile.eof() )
//writes last record twice.
20
Empty infile.txt
Outfile.txt
?? ??.?? ??.??
inFile >> hours >> rate;
while (! inFile.eof() )
{
gross = hours * rate;
outFile << hours << rate
<< gross << endl;
inFile >> hours >> rate;
}
//while will leave outfile
empty.
CIS162AB
do
{
inFile >> hours >> rate;
gross = hours * rate;
outFile << hours << rate
<< gross << endl;
} while (! inFile.eof() )
//do-while writes garbage
21
Do-while and File Processing
• Do-while processes last record twice.
• Do-while does not handle empty files.
• Use a while loop for file processing.
CIS162AB
22
Constructors and Classes
• Classes are defined for other programmers to use.
• When an object is declared using a class, a special
function called a constructor is automatically
called.
• Programmers use constructors to initialize
variables that are members of the class.
• Constructors can also be overloaded to give
programmers options when declaring objects.
CIS162AB
23
ifstream Constructor Overloaded
• Default constructor takes no parameters.
ifstream inFile;
inFile.open(“infile.txt”);
• Overloaded constructor takes parameters.
ifstream inFile (“infile.txt”);
Declare object and open file on same line.
Gives programmer options.
CIS162AB
24
Magic Formula
• Magic formula for formatting numbers to two
digits after the decimal point works with all
output streams (cout and ofstreams).
cout.setf(ios::fixed)
cout.setf(ios::showpoint)
cout.precision(2)
outFile.setf(ios::fixed)
outFile.setf(ios::showpoint)
outFile.precision(2)
• Note that cout and outfile are objects and setf and
precision are member functions.
CIS162AB
25
Set Flag
• setf means Set Flag.
• A flag is a term used with variables
that can have two possible values.
– On or off, 0 or 1
– Y or N,
True or false
• showpoint or don’t showpoint.
• Use unsetf to turn off a flag.
cout.unsetf(ios::showpoint)
CIS162AB
26
Right Justification
• To right justify numbers, use
the flag named right and
the function named width together.
• Numbers are right justified by default.
• Strings are left justified by default.
cout.setf(ios::right);
cout.width(6);
CIS162AB
27
Using right and width( )
outFile.setf(ios::right);
outFile.width(4);
outFile << hours;
outFile.width(6);
outFile << rate;
//use four spaces
//_ _40
//_ _40 _10.00
Have to enter four different commands;
it’s a lot of typing…
CIS162AB
28
Manipulator
• Short cut to call a formatting function.
outFile.setf(ios::right);
outFile << setw(4) << hours << setw(6) << rate;
//need #include <iomanip>
CIS162AB
29
Formatted I/O
• cin uses formatted input.
• If you cin an integer or double, it knows how to get
those values.
• If you enter an alpha character for a cin that is
expecting a number, the program will bomb (try it).
• To control for this, you need to get one character at
a time and then concatenate all of the values that
were entered.
• For example, for 10.00, you would get the 1, 0, a
period, 0, and then another 0.
• If the values were all valid, you would convert these
characters into a double using some built in
predefined
functions
(atof,
atoi).
CIS162AB
30
Character I/O Functions
• We actually use some of character I/O functions in
our displayContinue().
• To get one character including white space use get.
cin.get(char);
• To get entire line up to the newline use getline.
cin.getline(char, intSize);
• To put out one character use put.
cout.put(char);
CIS162AB
31
Functions to Check Value
• After you get one character, you will need
to check what it is.
isalpha(char) - (a-z)
isdigit(char) - (0-9)
isspace(char) - (whitespace)
isupper(char) – (checks for uppercase)
islower(char) – (checks for lowercase)
CIS162AB
32
Functions to Change Value
• These functions can change the case if the
value in the char variable is an alpha.
tolower(char)
toupper (char)
Is the following statement true or false?
if (islower(tolower(‘A’))) //true or false
CIS162AB
33
ASC II Table
• Review the ASCII table available on the website.
• ASCII table shows the binary value of all
characters.
• The hexadecimal values are also presented because
when a program aborts and memory contents are
displayed, the binary values are converted to
hexadecimal (Hex).
• The Dec column shows the decimal value of the
binary value.
• Look up CR, HT, Space, A, a
• It shows that the values for a capital A is the same
as a lowercase a.
• The values also inform us how data will be sorted.
CIS162AB
34
Control Structures Reviewed
•
•
•
•
1st Sequence Control
2nd Selection Control (if, if-else)
3rd Repetition Control (while, do-while)
4th Case Control
– Also known as Multiway Branching (if-else)
– Related to Selection Control
• The switch statement is an alternative
to if-else statements for handling cases.
CIS162AB
35
Switch Example – main()
void main()
{
char choice;
do // while (choice != 'D')
{
cout << "Enter the letter of the desired menu option. \n"
<< "Press the Enter key after entering the letter. \n \n"
<< "
<< "
<< "
<< "
CIS162AB
A: Add Customer \n"
B: Update Customer \n"
C: Delete Customer \n"
D: Exit Customer Module \n \n"
<< "Choice: ";
cin >> choice;
36
switch (choice)
{
//controlling expression
case ‘a’:
case 'A':
addCustomer();
break;
case 'B':
updateCustomer();
break;
case 'C':
deleteCustomer();
break;
case 'D':
cout << "Exiting Customer Module...please wait.\n\n";
break;
default:
cout << "Invalid Option Entered - Please try again. \n\n";
} // end of switch
} while (choice != 'D');
} // end of main
CIS162AB
37
Controlling Expression
• The valid types for the controlling expression are
–
–
–
–
bool
int
char
enum
• Enum is list of constants of the type int
– Enumeration
– Enum MONTH_LENGTH { JAN = 31, FEB = 28 …};
– Considered a data type that is programmer defined.
CIS162AB
38
Switch Statement Summary
• Use the keyword case and the colon to create a
label.
– case ‘A’:
– A Label is a place to branch to.
• Handle each possible case in the body.
• Use the default: label to catch errors.
• Don’t forget the break statement, or else the
flow will just fall through to next command.
• Compares to an if-else statement.
CIS162AB
39
Break Statement
• The break statement is used to end a sequence
of statements in a switch statement.
• It can also be used to exit a loop
(while, do-while, for-loop).
• When the break statement is executed in a
loop, the loop statement ends immediately
and execution continues with the statement
following the loop.
CIS162AB
40
Improper Use of Break
• If you have to use the break statement to get
out of a loop, the loop was probably not
designed correctly.
• There should be one way in and one way
out of the loop.
• Avoid using the break statement.
CIS162AB
41
Break Example
int loopCnt = 1;
while (true)
{
if (loopCnt <= empCnt)
break;
//always true
//Boolean is inside the loop
getRate()
getHours()
calcGross()
displayDetails()
loopCnt++;
}
CIS162AB
42
Continue Statement
• The continue statement ends the current
loop iteration.
• Transfers control to the Boolean expression.
• In a for loop, the statement transfers control
to the update expression.
• Avoid using the continue statement.
CIS162AB
43
Continue Example
int loopCnt = 1;
while (loopCnt <= empCnt)
{
getRate()
getHours()
calcGross()
if (gross < 0 )
//skip zeros
{
loopCnt++
continue;
//go to top of loop
}
displayDetails()
loopCnt++;
}
CIS162AB
44
Summary
•
•
•
•
•
•
File Processing
Introduced classes and objects
Formatting flags and functions
Character I/O and functions
ASCII Table
Switch Statement
CIS162AB
45