Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 3370.  Inserters and Extractors  Stream State  Files Streams  String Streams  Formatting  Manipulators  Internationalization.

Similar presentations


Presentation on theme: "CS 3370.  Inserters and Extractors  Stream State  Files Streams  String Streams  Formatting  Manipulators  Internationalization."— Presentation transcript:

1 CS 3370

2  Inserters and Extractors  Stream State  Files Streams  String Streams  Formatting  Manipulators  Internationalization

3  Insert an object into a stream  it does formatted output  Uses operator<<  the “left-shift” operator  the arrow suggests the direction of the data flow  Easy to define for your own classes

4  A Date class inserter: ostream& operator<<(ostream& os, const Date& d) { char fillc = os.fill('0'); os << setw(2) << d.getMonth() << '-' << setw(2) << d.getDay() << '-' << setw(4) << d.getYear() << setfill(fillc); return os; }

5 istream& operator>>(istream& is, Date& d) { is >> d.month; char dash; is >> dash; if(dash != '-') { is.putback(dash); is.setstate(ios::failbit); // Input disabled return is; } is >> d.day; is >> dash; if(dash != '-') { is.putback(dash); is.setstate(ios::failbit); } is >> d.year; return is; }

6  4 states:  eof: set upon an attempt to read past end-of-file ▪ sets fail automatically ▪ eof is meaningless for output streams  fail: an operation failed (e.g., alpha chars when reading int)  bad: stream is broken (no memory for buffer, device failure)  good: none of the other 3 states occurred  When an error occurs (fail or bad), the stream is disabled  All subsequent stream operations are ignored  Can re-enable stream operations with clear( )

7  Can test with associated member functions:  good( ), eof( ), fail( ), bad( )  Can test for successful input like this:  if (strm)  same as if (!strm.fail( ) && !strm.bad() && ! strm.eof( ))  Can also use exceptions

8  Can have exceptions thrown instead of checking state  Call the exceptions( ) member function  Can pick which states you want to throw: myStream.exceptions(ios::badbit);  The exception type thrown is ios::failure  ios is a base class for streams  See strmexcept.cpp

9  while (myStream >> x) // process x (this assumes no input failure)  while (getline(myStream, line)) // process line (ditto)  You can check conditions separately  if (myStream.eof( )) …  if (myStream.fail( )) …

10  get  getline  ignore  putback  unget  peek

11  get( )  returns the next character, or -1  whitespace included  get(char& c)  puts the character read in c  returns the stream  get(char* s, int n, char delim = ‘\n’)  reads n characters or up to delim

12  getline(char* s, int n, char delim = ‘\n’)  returns stream  reads and discards delim (different from get)  std namespace scope version  uses a string, not a char*  declared in  getline(istream& is, string& s, char delim = ‘\n’)  returns stream

13  Discards characters  ignore(int n = 1, int delim = eof( ))  returns stream  For a large n, use:  std::numeric_limits ::max()

14  unget()  Moves the stream’s get pointer back one  The next input op re-reads the previous character  putback(char)  Puts an arbitrary character into the buffer  So the next input op reads that character  peek()  Returns the next character without moving the get pointer beyond it

15  Classes ifstream, ofstream, fstream  declared in  Constructors open, destructors close automatically  All normal stream operations apply  Additional member functions:  close( ), open( )  Open modes  ios::in, ios::out, ios::app, ios::ate, ios::trunc, ios::binary  Can combine with a bitwise-or ( | )

16  Can move around in a stream  except when using the console, of course  Using functions seekp( ), seekg( )  seekp( ) seeks in the output buffer (p = “put”)  seekg( ) seeks in the input buffer (g = “get”)  Simultaneous I/O streams share the same buffer ▪ File streams keep the put/get pointers together ▪ In string streams they’re independent

17  Often used by databases  can access records randomly  Fields must have only built-in data  numbers, C-style strings, static arrays  no pointers!  uses binary mode  Use the write and read member functions  See employeedb.cpp

18  Classes istringstream, ostringstream, stringstream  declared in  Writes to or reads from a string  or both ▪ but remember the get/put pointers are independent  Useful for converting other data types to and from strings  Examples: C04/IString.cpp, C04/Ostring.cpp, C04/HTMLStripper2.cpp

19  Can set stream attributes  width, fill character, alignment, numeric base, floating-point format, decimal precision, etc.  Use setf( ) and unsetf( )  Example: C04/Format.cpp

20  The data area(s) held by the stream  One for input, one for output ▪ Streams that support both, have both  Can access via the function rdbuf( )  A “Way Station” for data en route  Usually don’t worry about it  One cool feature:  C04/SType.cpp, hexdec.cpp

21  A shorthand for setting/unsetting stream attributes  dec, hex, endl, flush  Achieved via a special overload convention  manipulators are functions  when inserted, the following function is called: ostream& ostream::operator<<(ostream& (*pf)(ostream&)) { return pf(*this); }  The function pf should do its work and return the stream

22  #include  Define a function with the required signature (below)  Do your work and return the stream: ostream& nl(ostream& os) { return os << '\n'; } int main() { cout << "newlines" << nl << "between" << nl << "each" << nl << "word" << nl; } cout << nl becomes… cout.operator<<(nl), which executes nl(cout), which executes cout << ‘\n’

23  setw(n), setfill(c), setprecision(n), etc.  Must include for these  Example: C04/Manips.cpp  Difficult to implement your own  not portable  Use Effectors instead  (see next slide)

24  Create a class whose constructor formats a string according to its purpose  That class also provides an operator<<  Example: C04/Effector.cpp

25  The streams we’ve been using traffic in bytes (char)  You can have streams that use wide characters (wchar_t)  displaying foreign characters requires platform support outside of C++  C++ just stores code points internally

26  The template that governs the standard stream classes: template > class basic_istream {...};  typedef basic_istream istream; typedef basic_istream wistream; typedef basic_ifstream ifstream; typedef basic_ifstream wifstream; typedef basic_istringstream istringstream; typedef basic_istringstream wistringstream;

27  Cultural customization of I/O formatting  A stream has an associated locale  Can change it with imbue( )  Example: Locale.cpp (Windows only)  Java’s locale support is much better


Download ppt "CS 3370.  Inserters and Extractors  Stream State  Files Streams  String Streams  Formatting  Manipulators  Internationalization."

Similar presentations


Ads by Google