Upload
jane-gilmore
View
215
Download
2
Tags:
Embed Size (px)
Citation preview
© Bruce M. Reynolds & Cliff Green, 2002
1
C++ Streams
C++ Programming CertificateUniversity of Washington
Cliff Green
© Bruce M. Reynolds & Cliff Green, 2002
2
C++ Streams
Input and Output
• C++ uses streams for input and output
• Like C, these are not defined within the language, but in the library
• What is a stream?– Think of a stream as a sequence of characters
• To use streams, we must add “#include <iostream>”• All standard library components are in the std
namespace, so appropriate directives or qualifications must be used– using std::cout;
© Bruce M. Reynolds & Cliff Green, 2002
3
C++ Streams
Why use streams?
• printf potentially wastes run-time memory– entire printf library is loaded to output a single char
• printf is theoretically slower than C++ streams– the format string is parsed at run-time instead of
compile-time– the C library does benefit from more years of
performance tuning, however• printf allows no compile-time type checking
– no protection against arguments not matching the format specifier
• printf is hard to extend to new types – %c, %d, %s, %f
© Bruce M. Reynolds & Cliff Green, 2002
4
C++ Streams
Types of streams
• Streams for:
– Input: istream, ifstream, istringstream
– Output: ostream, ofstream, ostringstream
© Bruce M. Reynolds & Cliff Green, 2002
5
C++ Streams
Stream operators
• ostream– output is called “insertion”– << is the “insertion” operator– Value is inserted into the output stream
• istream– input is called “extraction”– >> is the “extraction” operator– Value is extracted from the input stream
© Bruce M. Reynolds & Cliff Green, 2002
6
C++ Streams
Well-known streams
• Global stream objects are defined in <iostream>
– cin istream object connected to standard input
– cout ostream object connected to standard output
– cerr ostream object connected to standard error
– clog ostream object connected to standard error providing buffered output
© Bruce M. Reynolds & Cliff Green, 2002
7
C++ Streams
Examples
#include <iostream>using std::cout; using std::cin; using std::endl;
cout << “Hello, World” << endl;// endl is equivalent to “\n”, plus a buffer flush
int nValue = 123;cout << “Value is” << nValue << endl;
cin >> nValue;cout << “The new value is” << nValue << endl;
© Bruce M. Reynolds & Cliff Green, 2002
8
C++ Streams
Type-safety
• Streams can accept
– Any built-in data type
– Any complex expression that evaluates to a built-in data type
– Any type that can be implicitly converted to a built-in data type
– Any user-defined type for which the << or >> operators have been defined
© Bruce M. Reynolds & Cliff Green, 2002
9
C++ Streams
C++ classes preview (or review)
• Streams are instances of C++ classes.• Class instances (generally called objects) are like
structures in that they have fields (generally called members).
• Members can be data or functions (methods).• We use the “.” syntax to access members
infile.get(ch); // get a characteroutfile.close(); // close the streamoutfile.eof(); // end of stream?cout.precision(); // get the current precision
© Bruce M. Reynolds & Cliff Green, 2002
10
C++ Streams
Formatting
• precision() // sets the number of decimal places
• hex // change the base to hex• dec // change the base to dec• oct // change the base to oct
#include <iomanip>using std::cout; using std::endl;cout.precision( 4 )cout << std::hex << 100 << endl; // prints “64”cout << std::dec << 100 << endl; // prints “100”cout << std::oct << 100 << endl; // prints “144”
© Bruce M. Reynolds & Cliff Green, 2002
11
C++ Streams
Formatting
• left, right justification• fixed, scientific format of floats• width, precisionformat of numbers• fill sets/gets fill character• endl adds a CR and flushes• flush writes out the buffer• ws eats white space
• plus lots, lots more...
© Bruce M. Reynolds & Cliff Green, 2002
12
C++ Streams
Output
put( char c )Output a single character
cout.put( ‘a’ ); // prints “a”
write ( char const * s, int n )
Output n characters from string schar const * str = “My name is”;cout.write( str, 6 ); // prints “my nam”
© Bruce M. Reynolds & Cliff Green, 2002
13
C++ Streams
Input
get ( char c ) // inputs a single characterchar c;cin.get( c ); // reads one character
getline ( char * s, int n )Input up to n characters from standard input until “\n”
getline ( istream&, string& )Inputs characters from istream until “\n” (safer and more convenient than getline into a character array)
getline (cin, str);
© Bruce M. Reynolds & Cliff Green, 2002
14
C++ Streams
Streams are sophisticated objects!
ios
istream ostream
iostreamifstream ofstream
fstream
© Bruce M. Reynolds & Cliff Green, 2002
15
C++ Streams
Stream error states
• cin.eof() – true if end-of-file has been encountered
• cin.fail() – true when a format error has occurred – characters have not been lost– it is normally possible to recover from such a failure
• cin.bad() – true when an error occurs that results in loss of data– serious failures are normally not recoverable
• cin.good() – true if bad(), fail() and eof() are all false
© Bruce M. Reynolds & Cliff Green, 2002
16
C++ Streams
File processing
• Must include <iostream>• Must also include <fstream>
• File open and creation modes• ios::app append only• ios::ate open and seek to the end• ios::in input• ios::out output• ios::trunc if file exists, overwrite it• ios::binary open file in binary mode
© Bruce M. Reynolds & Cliff Green, 2002
17
C++ Streams
File processing
• Output file stream example– ofstream outFile( “filename”, ios::trunc );
• Input file stream example– ifstream inFile( “filename”, ios::in );
© Bruce M. Reynolds & Cliff Green, 2002
18
C++ Streams
File processing
ios overloaded operator member functions
• operator! – returns true if fail() or bad() would return true– example: if ( !outFile ) ...
• operator void*– converts the stream to a pointer which is NULL if fail()
or bad() would return true– example: while ( inFile >> name ) ...
© Bruce M. Reynolds & Cliff Green, 2002
19
C++ Streams
In-core formatting
• istringtream for input stream processing
#include <sstream> // old hdr is strstream
#include <string>
using std::istringstream; using std::string;
istringstream s(“1.414 47 This is a test”);
int i; float f;
string buff;
s >> f >> i >> buff; // buff == “This”
© Bruce M. Reynolds & Cliff Green, 2002
20
C++ Streams
In-core formatting
• ostringstream for output stream processing• the str() method of ostringstream returns a string object
#include <sstream>
#include <string>
using std::ostringstream; using std::string;
int i(20), j(30);
ostringstream os;
os << “i = “ << i << “, j = “ << j;
string s (os.str());
© Bruce M. Reynolds & Cliff Green, 2002
21
C++ Streams
Manipulators
• Manipulators perform formatting tasks
• Requires the inclusion of <iomanip>
• Can take zero or one argument
• Examples– setw– setprecision– dec, oct, hex, setbase
© Bruce M. Reynolds & Cliff Green, 2002
22
C++ Streams
Manipulators
• Manipulators are functions
• Manipulators may be user-defined
– ostream& bell( ostream& os ) { return os << ‘\a’; }
– ostream& tab( ostream& os ) { return os << ‘\t’; }
© Bruce M. Reynolds & Cliff Green, 2002
23
C++ Streams
istream functions
• get( char ) gets one character– returns istream– returns EOF on end-of-file
• get() gets one character– returns the character– returns EOF on end-of-file
• get( char* buff, int limit, char delimiter)– terminates when the delimiter is read– reads up to limit-1 characters– does not read the delimiter
© Bruce M. Reynolds & Cliff Green, 2002
24
C++ Streams
istream functions
• getline() – operates like the three-argument get using CR– does not store the delimiter– alternate version is non-member fct, takes istream as
first arg, string as second, delimiter as third
• ignore skips the specified number of characters
• putback places the previous character obtained by get back on the stream
• peek returns the next character, but does not remove it from the stream
© Bruce M. Reynolds & Cliff Green, 2002
25
C++ Streams
istream functions
• failbit is set if the fewer than the specified number of characters is read
• gcount returns the number of characters input by the previous read
© Bruce M. Reynolds & Cliff Green, 2002
26
C++ Streams
istream functions
• operator>>( char *)• operator>>( string )
– inputs the next word (delimited by white space)– automatically skips white space– setw sets the maximum string size
© Bruce M. Reynolds & Cliff Green, 2002
27
C++ Streams
Other useful manipulators and functions
• showpoint – output a floating-point number with a decimal point– number of significant digits specified by the precision
• uppercase– forces X or E for hex or floating point– forces all characters of hex to be uppercase
• boolalpha– forces boolean values to be output as “true”, “false”
© Bruce M. Reynolds & Cliff Green, 2002
28
C++ Streams
Other useful manipulators
• tie– synchronizes input and output to ensure that outputs
occur before subsequent inputs
© Bruce M. Reynolds & Cliff Green, 2002
29
C++ Streams
Hints for using iostreams
• Seeking within streams– ios::begin– ios::end– ios::cur
• Don’t forget operator precedence– Precedence of << is relatively low– Most expressions are OK without parentheses
• cout << a * b + c << endl;– Other operators have lower precedence!
• cout << ( a == b ? “equal” : “not equal” );
© Bruce M. Reynolds & Cliff Green, 2002
30
C++ Streams
<< and >> as non-member operators
• The stream insertion operator<< and stream extraction operator>> are overloaded in compiler libraries to handle data items of– built-in types– strings– pointer values
• To use these operators with user-defined types, each class must overload the operators
• Cannot be a member function of the class, since the stream (not the class object) is the left-hand argument to the operator.
© Bruce M. Reynolds & Cliff Green, 2002
31
C++ Streams
<< and >> as non-member operators, traditional technique
class MyClass {
friend ostream &operator<<(
ostream&, MyClass const& );
};
ostream& operator<<( // implementation
ostream &os, MyClass const& rhs) {
...
}
© Bruce M. Reynolds & Cliff Green, 2002
32
C++ Streams
<< and >> as non-member operators, alternative technique (no friend functions)
class MyClass {public:
ostream& streamOut (ostream&) const;};ostream& operator<<(ostream &os,
MyClass const& rhs) {return rhs.streamOut(os);
}
ostream& MyClass::streamOut(ostream& os) const {return os << “ … “;
}
© Bruce M. Reynolds & Cliff Green, 2002
33
C++ Streams
<< and >> as non-member operators
• Serialization: define ostream<< and istream>> overloading for all your classes.– Allows the class to write itself to any persistent
storage (file) and recover its contents back from the file.
• Debugging hint: Define ostream<< for all your classes!– Allows the developer to see the internal structure of
the object with one line of code.