Presentation is loading. Please wait.

Presentation is loading. Please wait.

Chapter 12 - C++ Stream Input/Output

Similar presentations


Presentation on theme: "Chapter 12 - C++ Stream Input/Output"— Presentation transcript:

1 Chapter 12 - C++ Stream Input/Output
Outline Introduction Streams Classic Streams vs. Standard Streams iostream Library Header Files Stream Input/Output Classes and Objects Stream Output Output of char * Variables Character Output using Member Function put Stream Input get and getline Member Functions istream Member Functions peek, putback and ignore Unformatted I/O using read, write and gcount

2 Chapter 12 - C++ Stream Input/Output
Outline Introduction to Stream Manipulators Integral Stream Base: dec, oct, hex and setbase Floating-Point Precision (precision, setprecision) Field Width (width, setw) Stream Format States and Stream Manipulators Trailing Zeros and Decimal Points (showpoint) Justification (left, right and internal) Padding (fill, setfill) Integral Stream Base (dec, oct, hex, showbase) Floating-Point Numbers; Scientific and Fixed Notation (scientific, fixed) Uppercase/Lowercase Control (uppercase) Specifying Boolean Format (boolalpha) Setting and Resetting the Format State via Member-Function flags Stream Error States

3 12.1 Introduction Overview of common I/O features C++ I/O
Object oriented References, function overloading, operator overloading Type safe I/O sensitive to data type Error if types do not match User-defined and standard types Makes C++ extensible

4 12.2 Streams Stream: sequence of bytes I/O operations often bottleneck
Input: from device (keyboard, disk drive) to memory Output: from memory to device (monitor, printer, etc.) I/O operations often bottleneck Wait for disk drive/keyboard input Low-level I/O Unformatted (not convenient for people) Byte-by-byte transfer High-speed, high-volume transfers High-level I/O Formatted Bytes grouped (into integers, characters, strings, etc.) Good for most I/O needs

5 12.2.1 Classic Streams vs. Standard Streams
Input/output chars (one byte) Limited number of characters (ASCII) Appendix B, p. 1216 Standard stream libraries Some languages need special alphabets Unicode character set supports this wchar_t character type Can do I/O with Unicode characters Examples: Unicode Latin Unicode Greek Unicode Arabic

6 12.2.2 iostream Library Header Files
Has header files with hundreds of I/O capabilities <iostream.h> Standard input (cin) Standard output (cout) Unbuffered error (cerr) Buffered error (clog) <iomanip.h> Formatted I/O with parameterized stream manipulators <fstream.h> File processing operations

7 12.2.3 Stream Input/Output Classes and Objects
iostream library provides many templates for handling common I/O operations. Templates "derive" through inheritance from basic_ios basic_iostream basic_ostream basic_istream basic_ios

8 12.2.3 Stream Input/Output Classes and Objects
iostream library has class templates for I/O basic_istream (stream input) basic_ostream (stream output) basic_iostream (stream input and output) typedef declares alias for data type For example: typedef Card *CardPtr; CardPtr synonym for Card * typedef istream, represents a specialization of basic_istream typedef ostream, represents a specialization of basic_ostream typedef iostream, represents a specialization of basic_iostream Allow char I/O Use these typedefs in chapter

9 12.2.3 Stream Input/Output Classes and Objects
Stream insertion and extraction operators cin istream object Connected to standard input (usually keyboard) cin >> grade; Compiler determines data type of grade Calls proper overloaded operator No extra type information needed

10 12.2.3 Stream Input/Output Classes and Objects
cout ostream object Standard output (usually display screen) cout << grade; As with cin, no type information needed cerr, clog ostream objects Connected to standard error device cerr outputs immediately (un-buffered) clog buffers output Outputs when buffer full or flushed (buffered)

11 12.2.3 Stream Input/Output Classes and Objects
C++ file processing similar Class templates basic_ifstream (file input) basic_ofstream (file output) basic_fstream (file I/O) Specializations allow for char I/O typedefs aliases for specializations ifstream ofstream fstream

12 12.2.3 Stream Input/Output Classes and Objects
Template hierarchy basic_iostream basic_ostream basic_istream basic_ios basic_ifstream basic_ofstream basic_fstream

13 12.3 Stream Output Output Uses ostream class Formatted and unformatted
Standard data types (<<) Characters (put function) Integers (decimal, octal, hexadecimal) Floating point numbers Various precision, forced decimal points, scientific notation Justified, padded data Uppercase/lowercase control

14 12.3.1 Output of char * Variables
C++ determines data type automatically Problem Try to print value of a char * (Memory address of first character of a string) However, << has been overloaded to print a null-terminated string Solution: cast (temporarily convert) char * to a void * A void * (void pointer) cannot be dereferenced A void * contains a memory address Use whenever printing value of a pointer Prints as a hex (base 16) number

15 fig12_03.cpp (1 of 1) fig12_03.cpp output (1 of 1)
// Fig. 12.3: fig12_03.cpp // Printing the address stored in a char * variable. #include <iostream> 4 using std::cout; using std::endl; 7 int main() { char *word = "test"; 11 // display value of char *, then display value of char * // static_cast to void * cout << "Value of word is: " << word << endl << "Value of static_cast< void * >( word ) is: " << static_cast< void * >( word ) << endl; 17 return 0; 19 20 } // end main fig12_03.cpp (1 of 1) fig12_03.cpp output (1 of 1) To print the value of the pointer, we must cast to a void *. Otherwise, the string is printed. Value of word is: test Value of static_cast< void *>( word ) is: 0046C070

16 12.3.2 Character Output using Member Function put
put function Outputs characters cout.put( 'A' ); // Outputs A May be cascaded cout.put( 'A' ).put( '\n' ); Dot operator (.) evaluates left-to-right Can use numerical (ASCII) value cout.put( 65 ); // Outputs A

17 12.4 Stream Input Formatted and unformatted input >> operator
istream >> operator Normally skips whitespace (blanks, tabs, newlines) Can change this Returns 0 when EOF encountered Otherwise, returns reference to object cin >> grade

18 12.4.1 get and getline Member Functions
get function cin.get() Returns one character from stream (even whitespace) Returns EOF if end-of-file encountered End-of-file Indicates end of input ctrl-z on IBM-PCs ctrl-d on UNIX and Macs cin.eof() Returns 1 (true) if EOF has occurred

19 // Fig. 12.4: fig12_04.cpp // Using member functions get, put and eof. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int main() 10 { int character; // use int, because char cannot represent EOF 12 // prompt user to enter line of text cout << "Before input, cin.eof() is " << cin.eof() << endl << "Enter a sentence followed by end-of-file:" << endl; 16 // use get to read each character; use put to display it while ( ( character = cin.get() ) != EOF ) cout.put( character ); 20 // display end-of-file character cout << "\nEOF in this system is: " << character << endl; cout << "After input, cin.eof() is " << cin.eof() << endl; 24 return 0; fig12_04.cpp (1 of 2) Function get (with no arguments) returns a single character input, unless EOF encountered.

20 fig12_04.cpp (2 of 2) fig12_04.cpp output (1 of 1)
26 27 } // end main Before input, cin.eof() is 0 Enter a sentence followed by end-of-file: Testing the get and put member functions ^Z EOF in this system is: -1 After input cin.eof() is 1 fig12_04.cpp (2 of 2) fig12_04.cpp output (1 of 1)

21 12.4.1 get and getline Member Functions
get(charRef) With character reference argument Gets one character, stores in charRef If EOF, returns -1 get(charArray, size, delimiter) Reads until size-1 characters read, or delimiter encountered Default delimiter '\n' Delimiter stays in input stream

22 fig12_05.cpp (1 of 2) cin will only read until the first whitespace.
// Fig. 12.5: fig12_05.cpp // Contrasting input of a string via cin and cin.get. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int main() 10 { // create two char arrays, each with 80 elements const int SIZE = 80; char buffer1[ SIZE ]; char buffer2[ SIZE ]; 15 // use cin to input characters into buffer1 cout << "Enter a sentence:" << endl; cin >> buffer1; 19 // display buffer1 contents cout << "\nThe string read with cin was:" << endl << buffer1 << endl << endl; 23 // use cin.get to input characters into buffer2 cin.get( buffer2, SIZE ); fig12_05.cpp (1 of 2) cin will only read until the first whitespace. No delimiter specified, so the default (\n) is used.

23 fig12_05.cpp (2 of 2) fig12_05.cpp output (1 of 1)
26 // display buffer2 contents cout << "The string read with cin.get was:" << endl << buffer2 << endl; 30 return 0; 32 33 } // end main fig12_05.cpp (2 of 2) fig12_05.cpp output (1 of 1) Enter a sentence: Contrasting string input with cin and cin.get The string read with cin was: Contrasting The string read with cin.get was: string input with cin and cin.get

24 12.4.1 get and getline Member Functions
getline(array, size, delimiter) Like last version of get Reads size-1 characters, or until delimiter found Default ‘\n’ Removes delimiter from input stream Puts null character at end of array

25 fig12_06.cpp (1 of 1) 1 // Fig. 12.6: fig12_06.cpp
// Inputting characters using cin member function getline. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int main() 10 { const int SIZE = 80; char buffer[ SIZE ]; // create array of 80 characters 13 // input characters in buffer via cin function getline cout << "Enter a sentence:" << endl; cin.getline( buffer, SIZE ); 17 // display buffer contents cout << "\nThe sentence entered is:" << endl << buffer << endl; 20 return 0; 22 23 } // end main fig12_06.cpp (1 of 1)

26 fig12_06.cpp output (1 of 1) Enter a sentence:
Using the getline member function The sentence entered is: fig12_06.cpp output (1 of 1)

27 12.4.2 istream Member Functions peek, putback and ignore
Discards characters from stream (default 1) Stops discarding once delimiter found Default delimiter EOF putback() Puts character obtained by get() back on stream peek() Returns next character in stream, but does not remove

28 12.5 Unformatted I/O using read, write and gcount
read (member of istream) Input raw bytes into character array If not enough characters read, failbit set gcount() returns number of characters read by last operation write (member of ostream) Output bytes from character array Stops when null character found char buffer[] = "HAPPY BIRTHDAY"; cout.write( buffer, 10 ); Outputs first 10 characters

29 // Fig. 12.7: fig12_07.cpp // Unformatted I/O using read, gcount and write. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int main() 10 { const int SIZE = 80; char buffer[ SIZE ]; // create array of 80 characters 13 // use function read to input characters into buffer cout << "Enter a sentence:" << endl; cin.read( buffer, 20 ); 17 // use functions write and gcount to display buffer characters cout << endl << "The sentence entered was:" << endl; cout.write( buffer, cin.gcount() ); cout << endl; 22 return 0; 24 25 } // end main fig12_07.cpp (1 of 1) Get 20 characters from input stream. Display the proper number of characters using write and gcount.

30 fig12_07.cpp output (1 of 1) Enter a sentence:
Using the read, write, and gcount member functions The sentence entered was: Using the read, writ fig12_07.cpp output (1 of 1)

31 12.6 Introduction to Stream Manipulators
Stream manipulators perform formatting tasks Field widths Precisions Format flags Fill character in fields Flushing streams Inserting newline in output stream Skipping whitespace in input stream

32 12.6.1 Integral Stream Base: dec, oct, hex and setbase
Integers normally base 10 (decimal) Stream manipulators to change base hex (base 16) oct (base 8) dec (resets to base 10) cout << hex << myInteger // Outputs hex value of // myInteger setbase(newBase) One of 8, 10, or 16 Base remains same until explicitly changed Parameterized stream manipulators Uses the header <iomanip> Take arguments: (like setbase)

33 fig12_08.cpp (1 of 2) Note usage of stream manipulator.
// Fig. 12.8: fig12_08.cpp // Using stream manipulators hex, oct, dec and setbase. #include <iostream> 4 using std::cout; using std::cin; using std::endl; using std::hex; using std::dec; 10 using std::oct; 11 12 #include <iomanip> 13 14 using std::setbase; 15 16 int main() 17 { int number; 19 cout << "Enter a decimal number: "; cin >> number; // input number 22 // use hex stream manipulator to show hexadecimal number cout << number << " in hexadecimal is: " << hex << number << endl; fig12_08.cpp (1 of 2) Note usage of stream manipulator.

34 fig12_08.cpp (2 of 2) fig12_08.cpp output (1 of 1)
26 // use oct stream manipulator to show octal number cout << dec << number << " in octal is: " << oct << number << endl; 30 // use setbase stream manipulator to show decimal number cout << setbase( 10 ) << number << " in decimal is: " << number << endl; 34 return 0; 36 37 } // end main fig12_08.cpp (2 of 2) fig12_08.cpp output (1 of 1) setbase is a parameterized stream manipulator (it takes an argument). Enter a decimal number: 20 20 in hexadecimal is: 14 20 in octal is: 24 20 in decimal is: 20

35 12.6.2 Floating-Point Precision (precision, setprecision)
Set precision of floating point numbers Use precision or setprecision Number of digits to right of decimal setprecision stream manipulator Pass number of decimal points cout << setprecision(5) precision member function cout.precision(newPrecision) newPrecision specifies number of decimal points With no arguments, returns current precision Settings remain until changed explicitly

36 // Fig. 12.9: fig12_09.cpp // Controlling precision of floating-point values. #include <iostream> 4 using std::cout; using std::cin; using std::endl; using std::fixed; 9 10 #include <iomanip> 11 12 using std::setprecision; 13 14 #include <cmath> // sqrt prototype 15 16 int main() 17 { double root2 = sqrt( 2.0 ); // calculate square root of 2 int places; 20 cout << "Square root of 2 with precisions 0-9." << endl << "Precision set by ios_base member-function " << "precision:" << endl; 24 cout << fixed; // use fixed precision fig12_09.cpp (1 of 2) Use fixed precision, not scientific notation (more details in 12.7).

37 26 // display square root using ios_base function precision for ( places = 0; places <= 9; places++ ) { cout.precision( places ); cout << root2 << endl; } 32 cout << "\nPrecision set by stream-manipulator " << "setprecision:" << endl; 35 // set precision for each digit, then display square root for ( places = 0; places <= 9; places++ ) cout << setprecision( places ) << root2 << endl; 39 return 0; 41 42 } // end main fig12_09.cpp (2 of 2) Note format of function precision and parameterized stream manipulator setprecision.

38 fig12_09.cpp output (1 of 1) Square root of 2 with precisions 0-9.
Precision set by ios_base member-function precision: 1 1.4 1.41 1.414 1.4142 Precision set by stream-manipulator setprecision: fig12_09.cpp output (1 of 1)

39 12.6.3 Field Width (width, setw)
width member function (base class ios_base) Sets the input or output field width Number of character positions for output Maximum number of characters that should be input cin.width(5) Returns previous width Fill characters/Padding are used when output too small for width Large outputs are printed (not truncated) Can also use setw stream manipulator When reading into char arrays Reads 1 less character (leave room for null)

40 // Fig. 12.10: fig12_10.cpp // Demonstrating member function width. #include <iostream> 4 using std::cout; using std::cin; using std::endl; 8 int main() 10 { int widthValue = 4; char sentence[ 10 ]; 13 cout << "Enter a sentence:" << endl; cin.width( 5 ); // input only 5 characters from sentence 16 // set field width, then display characters based on that width while ( cin >> sentence ) { cout.width( widthValue++ ); cout << sentence << endl; cin.width( 5 ); // input 5 more characters from sentence } // end while 23 return 0; fig12_10.cpp (1 of 2) Reads up to 4 characters, stops when whitespace read. Increment the output width.

41 fig12_10.cpp (2 of 2) fig12_10.cpp output (1 of 1)
25 26 } // end main Enter a sentence: This is a test of the width member function This is a test of the widt h memb er func tion fig12_10.cpp (2 of 2) fig12_10.cpp output (1 of 1)

42 12.7 Stream Format States and Stream Manipulators
Many stream manipulators for formatting All inherit from ios_base

43 12.7.1 Trailing Zeros and Decimal Points (showpoint)
Forces decimal number to print with trailing zeros For decimal number 79.0 79 without showpoint with showpoint (up to level of precision) Reset with noshowpoint

44 fig12_13.cpp (1 of 2) Different number of trailing zeros.
// Fig. 12.13: fig12_13.cpp // Using showpoint to control the printing of // trailing zeros and decimal points for doubles. #include <iostream> 5 using std::cout; using std::endl; using std::showpoint; 9 10 int main() 11 { // display double values with default stream format cout << "Before using showpoint" << endl << " prints as: " << << endl << " prints as: " << << endl << " prints as: " << << endl << endl; 17 // display double value after showpoint cout << showpoint << "After using showpoint" << endl << " prints as: " << << endl << " prints as: " << << endl << " prints as: " << << endl; 24 return 0; fig12_13.cpp (1 of 2) Different number of trailing zeros.

45 fig12_13.cpp (2 of 2) fig12_13.cpp output (1 of 1)
26 27 } // end main Before using showpoint prints as: 9.99 prints as: 9.9 prints as: 9 After using showpoint prints as: prints as: prints as: fig12_13.cpp (2 of 2) fig12_13.cpp output (1 of 1) Without showpoint, trailing zeros are removed.

46 12.7.2 Justification (left, right and internal)
left stream manipulator Left-justified, padding to right right stream manipulator Right-justified, padding to left Can set padding/fill character Next section internal Number's sign left-justified Number's value right-justified showpos forces sign to print Remove with noshowpos

47 // Fig. 12.14: fig12_14.cpp // Demonstrating left justification and right justification. #include <iostream> 4 using std::cout; using std::endl; using std::left; using std::right; 9 10 #include <iomanip> 11 12 using std::setw; 13 14 int main() 15 { int x = 12345; 17 // display x right justified (default) cout << "Default is right justified:" << endl << setw( 10 ) << x; 21 // use left manipulator to display x left justified cout << "\n\nUse std::left to left justify x:\n" << left << setw( 10 ) << x; 25 fig12_14.cpp (1 of 2) Right-justify x (default) (within a width of 10). Left-justify x (within a width of 10).

48 fig12_14.cpp (2 of 2) fig12_14.cpp output (1 of 1)
// use right manipulator to display x right justified cout << "\n\nUse std::right to right justify x:\n" << right << setw( 10 ) << x << endl; 29 return 0; 31 32 } // end main fig12_14.cpp (2 of 2) fig12_14.cpp output (1 of 1) Default is right justified: 12345 Use std::left to left justify x: Use std::right to right justify x:

49 fig12_15.cpp (1 of 1) fig12_15.cpp output (1 of 1)
// Fig. 12.15: fig12_15.cpp // Printing an integer with internal spacing and plus sign. #include <iostream> 4 using std::cout; using std::endl; using std::internal; using std::showpos; 9 10 #include <iomanip> 11 12 using std::setw; 13 14 int main() 15 { // display value with internal spacing and plus sign cout << internal << showpos << setw( 10 ) << 123 << endl; 18 return 0; 20 21 } // end main fig12_15.cpp (1 of 1) fig12_15.cpp output (1 of 1) Note use of internal and showpos.

50 12.7.3 Padding (fill, setfill)
Fill and setfill Specifies the fill character to be used with justified fields If no character is specified, spaces are used fill member function cout.fill('*') setfill stream manipulator setfill( '^' )

51 fig12_16.cpp (1 of 3) 1 // Fig. 12.16: fig12_16.cpp
// Using member-function fill and stream-manipulator setfill // to change the padding character for fields larger the // printed value. #include <iostream> 6 using std::cout; using std::endl; using std::showbase; 10 using std::left; 11 using std::right; 12 using std::internal; 13 using std::hex; 14 using std::dec; 15 16 #include <iomanip> 17 18 using std::setw; 19 using std::setfill; 20 fig12_16.cpp (1 of 3)

52 fig12_16.cpp (2 of 3) Note use of member function fill. 21 int main()
22 { int x = 10000; 24 // display x cout << x << " printed as int right and left justified\n" << "and as hex with internal justification.\n" << "Using the default pad character (space):" << endl; 29 // display x with plus sign cout << showbase << setw( 10 ) << x << endl; 32 // display x with left justification cout << left << setw( 10 ) << x << endl; 35 // display x as hex with internal justification cout << internal << setw( 10 ) << hex << x << endl << endl; 38 cout << "Using various padding characters:" << endl; 40 // display x using padded characters (right justification) cout << right; cout.fill( '*' ); cout << setw( 10 ) << dec << x << endl; 45 fig12_16.cpp (2 of 3) Note use of member function fill.

53 fig12_16.cpp (3 of 3) fig12_16.cpp output (1 of 1)
// display x using padded characters (left justification) cout << left << setw( 10 ) << setfill( '%' ) << x << endl; 48 // display x using padded characters (internal justification) cout << internal << setw( 10 ) << setfill( '^' ) << hex << x << endl; 52 return 0; 54 55 } // end main fig12_16.cpp (3 of 3) fig12_16.cpp output (1 of 1) 10000 printed as int right and left justified and as hex with internal justification. Using the default pad character (space): 10000 0x Using various padding characters: *****10000 10000%%%%% 0x^^^^2710 Indicates hexadecimal value.

54 12.7.4 Integral Stream Base (dec, oct, hex, showbase)
Print integer in various bases dec, oct, hex Stream extraction Decimal numbers default Preceding 0 for octal Preceding 0x or 0X for hex showbase Forces base of number to be shown Remove with noshowbase

55 // Fig. 12.17: fig12_17.cpp // Using stream-manipulator showbase. #include <iostream> 4 using std::cout; using std::endl; using std::showbase; using std::oct; using std::hex; 10 11 int main() 12 { int x = 100; 14 // use showbase to show number base cout << "Printing integers preceded by their base:" << endl << showbase; 18 cout << x << endl; // print decimal value cout << oct << x << endl; // print octal value cout << hex << x << endl; // print hexadecimal value 22 return 0; 24 25 } // end main fig12_17.cpp (1 of 1) Forces numbers to be printed with a preceding 0 (if octal) or 0x (if hexadecimal).

56 Printing integers preceded by their base: 100 0144 0x64
Indicates octal value. Indicates hexadecimal value. fig12_17.cpp output (1 of 1)

57 12.7.5 Floating-Point Numbers; Scientific and Fixed Notation (scientific, fixed)
Stream manipulator scientific Forces scientific notation e+009 Stream manipulator fixed Forces fixed point format Prints number of decimals specified by precision If no manipulator specified Format of number determines how it appears

58 // Fig. 12.18: fig12_18.cpp // Displaying floating-point values in system default, // scientific and fixed formats. #include <iostream> 5 using std::cout; using std::endl; using std::scientific; using std::fixed; 10 11 int main() 12 { double x = ; double y = 1.946e9; 15 // display x and y in default format cout << "Displayed in default format:" << endl << x << '\t' << y << endl; 19 // display x and y in scientific format cout << "\nDisplayed in scientific format:" << endl << scientific << x << '\t' << y << endl; 23 fig12_18.cpp (1 of 2) Note differing initializations, and use of the scientific stream manipulator.

59 fig12_18.cpp (2 of 2) fig12_18.cpp output (1 of 1)
// display x and y in fixed format cout << "\nDisplayed in fixed format:" << endl << fixed << x << '\t' << y << endl; 27 return 0; 29 30 } // end main fig12_18.cpp (2 of 2) fig12_18.cpp output (1 of 1) Note difference between the default, fixed, and scientific formats. Displayed in default format: e+009 Displayed in scientific format: e e+009 Displayed in fixed format:

60 12.7.6 Uppercase/Lowercase Control (uppercase)
Stream manipulator uppercase Forces an uppercase E in scientific notation 1E10 // equal to Forces an uppercase X in hex notation and uppercase hex letters 0XABCD // equal to ABCD (hex) By default, lowercase Reset with nouppercase

61 fig12_19.cpp output (1 of 1) Force uppercase format.
// Fig. 12.19: fig12_19.cpp // Stream-manipulator uppercase. #include <iostream> 4 using std::cout; using std::endl; using std::uppercase; using std::hex; 9 10 int main() 11 { cout << "Printing uppercase letters in scientific" << endl << "notation exponents and hexadecimal values:" << endl; 14 // use std:uppercase to display uppercase letters; // use std::hex to display hexadecimal values cout << uppercase << 4.345e10 << endl << hex << << endl; 19 return 0; 21 22 } // end main fig12_19.cpp output (1 of 1) Force uppercase format.

62 fig12_19.cpp output (1 of 1) Printing uppercase letters in scientific
notation exponents and hexadecimal values: 4.345E+010 75BCD15 fig12_19.cpp output (1 of 1)

63 12.7.7 Specifying Boolean Format (boolalpha)
Data type bool Values true or false Outputs 0 (false) or 1 (true) when used with << Displayed as integers Stream manipulator boolalpha Display strings "true" and "false” instead of 0 and 1 Reset with noboolalpha

64 // Fig. 12.20: fig12_20.cpp // Demonstrating stream-manipulators boolalpha and noboolalpha. #include <iostream> 4 using std::cout; using std::endl; using std::cin; using std::boolalpha; using std::noboolalpha; 10 11 int main() 12 { bool booleanValue = true; 14 // display default true booleanValue cout << "booleanValue is " << booleanValue << endl; 17 // display booleanValue after using boolalpha cout << "booleanValue (after using boolalpha) is " << boolalpha << booleanValue << endl << endl; 21 cout << "switch booleanValue and use noboolalpha" << endl; booleanValue = false; // change booleanValue cout << noboolalpha << endl; // use noboolalpha 25 fig12_20.cpp (1 of 2) bool variables can be false or true. Note use of the boolalpha stream manipulator.

65 fig12_20.cpp (2 of 2) fig12_20.cpp output (1 of 1)
// display default false booleanValue after using noboolalpha cout << "booleanValue is " << booleanValue << endl; 28 // display booleanValue after using boolalpha again cout << "booleanValue (after using boolalpha) is " << boolalpha << booleanValue << endl; 32 return 0; 34 35 } // end main fig12_20.cpp (2 of 2) fig12_20.cpp output (1 of 1) booleanValue is 1 booleanValue (after using boolalpha) is true switch booleanValue and use noboolalpha booleanValue is 0 booleanValue (after using boolalpha) is false

66 12.7.8 Setting and Resetting the Format State via Member-Function flags
Can save/restore format states After apply many changes, may want to restore original Member function flags cout.flags() With no argument Returns current state as fmtflags object in class ios_base Represents format state With fmtflags argument Sets state Returns previous state

67 fig12_21.cpp (1 of 2) Save original format using function flags.
// Fig. 12.21: fig12_21.cpp // Demonstrating the flags member function. #include <iostream> 4 using std::cout; using std::endl; using std::oct; using std::scientific; using std::showbase; 10 using std::ios_base; 11 12 int main() 13 { int integerValue = 1000; double doubleValue = ; 16 // display flags value, int and double values (original format) cout << "The value of the flags variable is: " << cout.flags() << "\nPrint int and double in original format:\n" << integerValue << '\t' << doubleValue << endl << endl; 21 // use cout flags function to save original format ios_base::fmtflags originalFormat = cout.flags(); cout << showbase << oct << scientific; // change format 25 fig12_21.cpp (1 of 2) Save original format using function flags.

68 fig12_21.cpp (2 of 2) Restore original format.
// display flags value, int and double values (new format) cout << "The value of the flags variable is: " << cout.flags() << "\nPrint int and double in a new format:\n" << integerValue << '\t' << doubleValue << endl << endl; 30 cout.flags( originalFormat ); // restore format 32 // display flags value, int and double values (original format) cout << "The restored value of the flags variable is: " << cout.flags() << "\nPrint values in original format again:\n" << integerValue << '\t' << doubleValue << endl; 38 return 0; 40 41 } // end main fig12_21.cpp (2 of 2) Restore original format.

69 fig12_21.cpp output (1 of 1) The value of the flags variable is: 513
Print int and double in original format:   The value of the flags variable is: Print int and double in a new format: e-002 The restored value of the flags variable is: 513 Print values in original format again: fig12_21.cpp output (1 of 1)

70 12.8 Stream Error States Test state of stream using bits
eofbit set when EOF encountered Function eof returns true if eofbit set cin.eof() failbit set when error occurs in stream Data not lost, error recoverable Function fail returns true if set badbit set when data lost Usually nonrecoverable Function bad goodbit set when badbit, failbit and eofbit off Function good

71 12.8 Stream Error States Member functions rdstate() clear()
Returns error state of stream Can test for goodbit, badbit, etc. Better to test using good(), bad() clear() Default argument goodbit Sets stream to "good" state, so I/O can continue Can pass other values cin.clear( ios::failbit ) Sets failbit Name "clear" seems strange, but correct

72 // Fig. 12.22: fig12_22.cpp // Testing error states. #include <iostream> 4 using std::cout; using std::endl; using std::cin; 8 int main() 10 { int integerValue; 12 // display results of cin functions cout << "Before a bad input operation:" << "\ncin.rdstate(): " << cin.rdstate() << "\n cin.eof(): " << cin.eof() << "\n cin.fail(): " << cin.fail() << "\n cin.bad(): " << cin.bad() << "\n cin.good(): " << cin.good() << "\n\nExpects an integer, but enter a character: "; 21 cin >> integerValue; // enter character value cout << endl; 24 fig12_22.cpp (1 of 2) Output the original states using the member functions.

73 fig12_22.cpp (2 of 2) Note the use of clear.
// display results of cin functions after bad input cout << "After a bad input operation:" << "\ncin.rdstate(): " << cin.rdstate() << "\n cin.eof(): " << cin.eof() << "\n cin.fail(): " << cin.fail() << "\n cin.bad(): " << cin.bad() << "\n cin.good(): " << cin.good() << endl << endl; 32 cin.clear(); // clear stream 34 // display results of cin functions after clearing cin cout << "After cin.clear()" << "\ncin.fail(): " << cin.fail() << "\ncin.good(): " << cin.good() << endl; 39 return 0; 41 42 } // end main fig12_22.cpp (2 of 2) Note the use of clear.

74 fig12_22.cpp output (1 of 1) Before a bad input operation:
cin.rdstate(): 0 cin.eof(): 0 cin.fail(): 0 cin.bad(): 0 cin.good(): 1 Expects an integer, but enter a character: A After a bad input operation: cin.rdstate(): 2 cin.fail(): 1 cin.good(): 0 After cin.clear() fig12_22.cpp output (1 of 1)


Download ppt "Chapter 12 - C++ Stream Input/Output"

Similar presentations


Ads by Google