advanced input and output

55
1 Advanced Input and Output Advanced Input and Output COSC1567 COSC1567 C++ Programming C++ Programming Lecture 9

Upload: miette

Post on 04-Jan-2016

34 views

Category:

Documents


3 download

DESCRIPTION

Lecture 9. Advanced Input and Output. COSC1567 C++ Programming. Objectives. How cout and cin possess the same traits as other C++ objects How to use istream member functions, particularly get(), ignore(), and getline() - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Advanced Input and Output

11

Advanced Input and OutputAdvanced Input and Output

COSC1567COSC1567

C++ ProgrammingC++ Programming

Lecture 9

Page 2: Advanced Input and Output

22

ObjectivesObjectives

• How cout and cin possess the same traits as other C++ objects

• How to use istream member functions, particularly get(), ignore(), and getline()

• How to use ostream member functions, particularly setf(), unsetf(), width(), and precision()

• How to create your own manipulator functions

Page 3: Advanced Input and Output

33

ObjectivesObjectives

• How to use built-in manipulators

• How to create a manipulator that takes an argument

• About computer files and the data hierarchy

• How to perform file output

• How to read a file from within a program

• How to write class objects to files

• How to read a data file into class objects

Page 4: Advanced Input and Output

44

Understanding CIN and Understanding CIN and COUT as Class ObjectsCOUT as Class Objects

• You can think of cout and cin as real-world objects• Like other C++ objects you have created, cout and

cin are members of a class• Their class is derived from another class (which is

derived from yet another class), so they use inheritance

• The cout and cin objects can take advantage of overloaded operators such as << and >> which are used for shifting bits in other contexts

Page 5: Advanced Input and Output

55

Understanding CIN and Understanding CIN and COUT as Class ObjectsCOUT as Class Objects

• When you include iostream.h in a program, you are including a file that contains the definition for a derived class named iostream

• In C++, a stream is a sequence of characters used to perform input and output operations

• The name iostream is short for “Input and Output” stream

Page 6: Advanced Input and Output

66

Using istream Member Using istream Member FunctionsFunctions

• In C++, the easiest way to read in a character

is to use cin with the extraction operator, for

example, cin>>someVariable;

• The extraction operator is actually an

overloaded function named operator>>()

Page 7: Advanced Input and Output

77

Using the get() FunctionUsing the get() Function

• Another member function of the istream class is get()

• The get() function takes a character argument and returns a reference to the object (the istream class) that invoked the get() function

• Therefore more than one get() function can be included in a statement

• Its prototype has the following form:istream& get(char &c);

Page 8: Advanced Input and Output

88

Using the get() FunctionUsing the get() Function

• Most compilers overload get() so that, in addition to taking a character reference as an argument, it also can take no argument

• The following version of the get() function returns the character being read in as an integer

• Its prototype is:

int get( );• The third argument is the character that terminates the

entry, often called the delimiter character• The default value to stop data entry, as you can see

from the prototype, is the Enter key, which coded as ‘\n’

Page 9: Advanced Input and Output

99

Using the get() FunctionUsing the get() Function

• The second argument of the get() function—the number of characters to be stored—is very important

• Without the second argument, a user could destroy memory by entering a string of characters that was longer than the area prepared to receive it

• The output in Figure 10-3 and 10-4 illustrate one benefit of using the get() function instead of the extraction operator (>>) for keyboard data entry

Ex9-1.cpp

Page 10: Advanced Input and Output

1010

Using the get() FunctionUsing the get() Function

• One unfortunate side effect of the get() function is that it leaves unused characters in the input stream

• A subsequent call to get() retrieves the next (unused) character, whether or not that retrieval was intended

• As shown in Figure 10-6, the program doesn’t stop to obtain your grade, because the second call to get() already has been satisfied with the newline character

Page 11: Advanced Input and Output

1111

The UserNameAndGrade The UserNameAndGrade ProgramProgram

Ex9-2.cpp

Page 12: Advanced Input and Output

1212

Using the get() FunctionUsing the get() Function

• The program output shown in Figure 10-6 includes your first name and a newline (instead of a grade) for the letter grade

• To allow the user to enter a grade, you could add a third cin.get() statement to the program, as shown in Figure 10-7

Page 13: Advanced Input and Output

1313

Using the get() FunctionUsing the get() Function

• Programmers say this call to the get() function absorbs or consumes the extra character

Page 14: Advanced Input and Output

1414

Using the get() FunctionUsing the get() Function

• If you run the program in Figure 10-7 and

enter a name that is too long, the output

looks like Figure 10-9

Ex9-2.cpp

Page 15: Advanced Input and Output

1515

Using the ignore() FunctionUsing the ignore() Function

• It is impossible to guess how many cin.get() statements are needed to consume all the potential additional letters of a name if you use the UserNameAndGrade2 program—imagine the challenge of a name such as Barbara Penelope

• A superior alternative is to use the ignore() function to ignore or skip any additional characters left in the input stream

• The prototype of the ignore() function is:istream& ignore(int length = 1, char c = ‘\n’);

Page 16: Advanced Input and Output

1616

The UserNameAndGrade The UserNameAndGrade Program Using ignore()Program Using ignore()

Ex9-2.cpp

Page 17: Advanced Input and Output

1717

Using the ignore() FunctionUsing the ignore() Function

Page 18: Advanced Input and Output

1818

Using the getline() FunctionUsing the getline() Function

• As an alternative to using an extra call to get() to absorb the Enter key after character data entry, or using the ignore() function to absorb any number of characters, you can include another istream member, getline()

• Its prototype is:istream& getline(char *str,int len, char c=‘\n’);

• The getline() function reads a line of text at the address represented by str

• It reads text until it reaches either the length used as the second argument or the character used as the third argument

Page 19: Advanced Input and Output

1919

Using the getline() FunctionUsing the getline() Function

• The program in Figure 10-13, and the output in Figure 10-14, show how the getline() function correctly accepts characters up to and including the default newline delimiter

Page 20: Advanced Input and Output

2020

Using the getline() FunctionUsing the getline() Function

• When you use a delimiter other than ‘\n’ with getline(), the getline()

consumes the delimiter but leaves he subsequent Enter key in the

input stream, so you still must account for it

• The program in Figure 10-15 and its output in Figure 10-16

illustrate the use of get() to consume the Enter key by getline()

Page 21: Advanced Input and Output

2121

Using the getline() FunctionUsing the getline() FunctionEx9-3.cpp

Page 22: Advanced Input and Output

2222

Other istream Member Other istream Member FunctionsFunctions

• Most compilers support other istream member functions with names such as eof(), bad(), and good()

• The istream class is not mysterious

• It is just a class, and cin is just an object that already has been instantiated for you

Page 23: Advanced Input and Output

2323

Using ostream Member Using ostream Member FunctionsFunctions

• The concepts you have learned while studying the cin object apply to the cout object as well

• The ostream class supports member functions and overloaded operators just like the istream class — or any other class, for that matter

Page 24: Advanced Input and Output

2424

Using Format Flags with Using Format Flags with setf() and unsetf()setf() and unsetf()

• Many of the states of the cout object are contained in a single long integer field, in which each bit represents some condition of the object

• The arguments that determine the state of the cout object are called format flags or state flags

• All format flags begin with ios::• One member function of the ios class, the setf() function,

takes arguments that set the bits of cout; that is, the arguments turn the bits in the flag on or off

• Another member function, unsetf(), can be used to deselect the bit: cout.unsetf(ios::showpos);

• Using the setf() function, you also can combine format flags using the bitwise OR operator (|)

Page 25: Advanced Input and Output

2525

Using Format Flags with Using Format Flags with setf() and unsetf()setf() and unsetf()

• Some commonly used format flags are:

– ios::left—left-justifies output within the field size, which may be set by the width() function (described in a following section)

– ios::right—right-justifies output within the field size

– ios::dec—formats numbers in decimal (base 10)

– ios::hex—formats numbers in hexadecimal (base 16)

– ios::oct—formats numbers in octal (base 8)

– ios::showpos—inserts a + before positive numbers

– ios::showpoint—displays the decimal point and six decimal positions for all floating-point numbers

Page 26: Advanced Input and Output

2626

Using the width() FunctionUsing the width() Function

• You can change the output field width with the iostream member width() function

• This function defines the size of the output field in which the passed argument will be displayed

• The width() function applies only to the first subsequent field to be output

Page 27: Advanced Input and Output

2727

Using the width() FunctionUsing the width() Function Ex9-4.cpp

Page 28: Advanced Input and Output

2828

Using the precision() Using the precision() FunctionFunction

• You can use the precision() function to control the number of significant digits you see in the output

• If you want to control the number of positions shown to the right of the decimal point (instead of simply the number of significant positions visible), you must combine cout.setf(ios::fixed); and cout.precision();

Page 29: Advanced Input and Output

2929

Using the precision() Using the precision() FunctionFunction

• Declare an array of doubles, assign values with different numbers of significant digits, and then display all the values using the same precision

Ex9-5.cpp

Page 30: Advanced Input and Output

3030

Creating Manipulator Creating Manipulator FunctionsFunctions

• If you need to display a variable named amountMoney in currency format with a dollar sign, in base 10, in a field size of eight, you might write the code shown in Figure 10-20

• When you create a manipulator function, the desired results become much clearer

• A manipulator function is used to manipulate, or change, the state of the cout object

Page 31: Advanced Input and Output

3131

Creating Manipulator Creating Manipulator FunctionsFunctions

• You could write a manipulator to format output as currency

• The function contains statements that display the dollar sign, set some ios flags, and set the width

• In the function shown in Figure 10-21, a reference to ostream is passed into the function as an argument

Ex9-6.cpp

Page 32: Advanced Input and Output

3232

Using Built-In ManipulatorsUsing Built-In Manipulators

• Some manipulators are so useful that they

are already coded and placed in libraries

included with your C++ compiler

• You already have used the endl manipulator

to output a newline character and flush the

output stream

Page 33: Advanced Input and Output

3333

Using the setprecision() Using the setprecision() ManipulatorManipulator

• You use the setprecision() manipulator to specify the number of decimals that will print

• The setprecision() manipulator works like the precision() function—it specifies the number of significant digits to display

• It is considered a manipulator instead of a member function because you chain a call to setprecision() along with other output and the insertion operator, rather than using an object and a dot operator, as you do with cout.precision()

Page 34: Advanced Input and Output

3434

The DemoPrecision2 ProgramThe DemoPrecision2 Program

Page 35: Advanced Input and Output

3535

Using the setprecision() Using the setprecision() ManipulatorManipulator

• Any C++ manipulator, such as setprecision(), that takes an argument requires the inclusion of the iomanip file in your program

• The program in Figure 10-22 produces the output in Figure 10-23

Ex9-7.cpp

Page 36: Advanced Input and Output

3636

Using the setw() ManipulatorUsing the setw() Manipulator

• The setw() manipulator allows you to set the width of a field for output

• Use of the setw() manipulator requires inclusion of the iomanip.h file, because setw() requires an argument that represents the width of the output field

• The setw() manipulator works like the width() member function you can use with the cout objects; the advantage of using setw() is its chaining capability in a cout statement

Page 37: Advanced Input and Output

3737

Using the setiosflags() and Using the setiosflags() and resetiosflags() Manipulatorsresetiosflags() Manipulators

• Two additional manipulators, setiosflags() and resetiosflags(), each perform several manipulations, depending on the flags (such as ios::dec or ios::showpoint) they receive as arguments

• The setiosflags() manipulator turns on bit codes for the attributes named as arguments; the resetiosflags() manipulator turns off those bit codes

Ex9-8.cpp

Page 38: Advanced Input and Output

3838

Understanding Computer FilesUnderstanding Computer Files

• When you store data items in a computer system, you use a permanent storage device, such as a disk or a reel of magnetic tape

• The term permanent is used to contrast this type of data storage with the temporary data storage that exists in computer memory

• Data items typically exist in memory for only a short time

• It is common practice to store data in a data hierarchy, which represents the relationships between the sizes of data units that business professionals most often use

Page 39: Advanced Input and Output

3939

The fstream Family TreeThe fstream Family Tree

Page 40: Advanced Input and Output

4040

Using the getline() FunctionUsing the getline() Function

• If a file contains data that ends with a newline character, then it’s a bit awkward to have a program that uses the get() function to read data from a file because you must discard the newline character

• As an alternative, you can use the getline() member function to read input data

• The getline() function takes the form fileObject.getline(destination, sizeLimit);, where destination is a declared character string, and sizeLimit is the maximum number of characters you want to store

Page 41: Advanced Input and Output

4141

Using the getline() FunctionUsing the getline() Function

• Write a program that uses getline() to read the name file created in the WriteNameToFile.cpp program

Ex9-9.cpp

Page 42: Advanced Input and Output

4242

Using the getline() FunctionUsing the getline() FunctionEx9-10.cpp

Page 43: Advanced Input and Output

4343

Writing Objects to FilesWriting Objects to Files

• It is simple and intuitive to use the ofstream class’s overloaded operator to write characters and strings to files

• It makes sense, however, that in object-oriented programs you should also be able to write objects to disk files

• The write() function allows you to do just that; the prototype is:

ostream& write(char *c, int length);

• The write() function accepts two arguments: a pointer to a character and an integer

Page 44: Advanced Input and Output

4444

The Customer ClassThe Customer Class

Page 45: Advanced Input and Output

4545

Writing Customer Records Writing Customer Records to a Fileto a File

Ex9-11.cpp

Page 46: Advanced Input and Output

4646

Writing Objects to FilesWriting Objects to Files

• You can create an array of customer objects, perform the data entry required for the Customers, and write the output to a disk (see the format on page 394 of the textbook)

• The program in Figure 10-40 executes a for loop numCusts times (five times), performing data entry and writing to the file each time

Page 47: Advanced Input and Output

4747

Writing an Array of Customer Writing an Array of Customer Records to a FileRecords to a File

Page 48: Advanced Input and Output

4848

Reading Objects from FilesReading Objects from Files

• It is more convenient to read a data file directly into an array of class objects

• You can accomplish this goal with the read() function

• The read() function prototype is quite similar to the prototype for the write() function

• The prototype for read() is:istream& read(char *c, int length);

• The read() function requires a pointer to a character, so you must perform a cast when you read an object

Ex9-12.cpp

Page 49: Advanced Input and Output

4949

Reading Customer Records Reading Customer Records from a Filefrom a File

Page 50: Advanced Input and Output

5050

Reading Objects from FilesReading Objects from Files

• The read() function also requires the size of the object being read

• Instead of reading one record at a time into the Customer array, you can perform one read for the entire array

Page 51: Advanced Input and Output

5151

Reading an Array of RecordsReading an Array of Records

Page 52: Advanced Input and Output

5252

SummarySummary

• The C++ objects cout and cin possess the same traits as other C++ objects—they are members of a class, use inheritance, have access to overloaded operators, and have all other object traits

• To input data, you can use the extraction operator (>>) after the cin object

• To output data you can use the insertion operator with the cout object

• A manipulator function is used to manipulate, or change, the state of the cout object

Page 53: Advanced Input and Output

More examplesMore examples

• Ex9-13.cpp

• Ex9-14.cpp

• Ex9-15.cpp

5353

Page 54: Advanced Input and Output

5454

SummarySummary

• Built-in manipulators include endl, newline, setprecision(), setw(), setiosflags(), and resetiosflags()

• Creating a manipulator that takes an argument involves writing two functions

• The address of the stream and the argument itself must be passed to the manipulator function

• Usually, you store data on a disk (or other permanent storage device) in a data hierarchy in which fields are parts of data records that make up data files

Page 55: Advanced Input and Output

5555

SummarySummary

• To perform file output, you must instantiate your own member of the ofstream class

• To read a file from within a program, you can create an object that is an instantiation of the ifstream class

• The write() function allows you to write class objects to files

• The write() function accepts two arguments: a character pointer to the address of the argument being written to the file, and the size of the object being written

• You can use the read() function to read a data file into class objects