1 / 27

IOStreams

CS 3370. IOStreams. Agenda. Inserters and Extractors Stream State Files Streams String Streams Formatting Manipulators Internationalization. Inserters. Insert an object into a stream it does formatted output Uses operator<< the “left-shift” operator

Télécharger la présentation

IOStreams

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CS 3370 IOStreams

  2. Agenda • Inserters and Extractors • Stream State • Files Streams • String Streams • Formatting • Manipulators • Internationalization

  3. Inserters • Insert an object into a stream • it does formattedoutput • Uses operator<< • the “left-shift” operator • the arrow suggests the direction of the data flow • Easy to define for your own classes

  4. Inserter ExampleFormatted Output • 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. Extractor ExampleFormatted Input 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. Stream State • 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. Testing the Stream State • 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. Streams and Exceptions • 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. Input IdiomMost operations return the stream • 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. Handy Input Functions • get • getline • ignore • putback • unget • peek

  11. get • 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. getlineTwo versions • 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 <string> • getline(istream& is, string& s, char delim = ‘\n’) • returns stream

  13. ignore • Discards characters • ignore(int n = 1, int delim = eof( )) • returns stream • For a large n, use: • std::numeric_limits<streamsize>::max()

  14. unget, putback, peek • 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. File Streams • Classes ifstream, ofstream, fstream • declared in <fstream> • 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. Stream Positioning • 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. Files With Fixed-length Records • 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. String Streams • Classes istringstream, ostringstream, stringstream • declared in <sstream> • 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. Output Formatting • 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. Stream Buffers • 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. Manipulators • 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. Creating a Manipulator • #include <iostream> • 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. Manipulators with Arguments • setw(n), setfill(c), setprecision(n), etc. • Must include <iomanip> for these • Example: C04/Manips.cpp • Difficult to implement your own • not portable • Use Effectors instead • (see next slide)

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

  25. Wide Streams • 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. basic_istream • The template that governs the standard stream classes:template<class charT, class traits = char_traits<charT> >class basic_istream {...}; • typedef basic_istream<char> istream;typedef basic_istream<wchar_t> wistream;typedef basic_ifstream<char> ifstream;typedef basic_ifstream<wchar_t> wifstream;typedef basic_istringstream<char> istringstream;typedef basic_istringstream<wchar_t> wistringstream;

  27. Locales • 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

More Related