Annotation of GNUtools/libg++/libio/iostream.texi, revision 1.1.1.1

1.1       root        1: \input texinfo                                 @c -*-Texinfo-*-
                      2: @c Copyright (c) 1993 Free Software Foundation, Inc.
                      3: 
                      4: @c %**start of header 
                      5: @setfilename iostream.info
                      6: @settitle The GNU C++ Iostream Library
                      7: @setchapternewpage odd
                      8: @c %**end of header
                      9: 
                     10: @ifinfo
                     11: @format
                     12: START-INFO-DIR-ENTRY
                     13: * iostream::                    The C++ input/output facility.
                     14: END-INFO-DIR-ENTRY
                     15: @end format
                     16: 
                     17: This file describes libio, the GNU library for C++ iostreams and C stdio.
                     18: 
                     19: libio includes software developed by the University of California,
                     20: Berkeley.
                     21: 
                     22: Copyright (C) 1993 Free Software Foundation, Inc.
                     23: 
                     24: Permission is granted to make and distribute verbatim copies of
                     25: this manual provided the copyright notice and this permission notice
                     26: are preserved on all copies.
                     27: 
                     28: @ignore
                     29: Permission is granted to process this file through TeX and print the
                     30: results, provided the printed document carries copying permission
                     31: notice identical to this one except for the removal of this paragraph
                     32: (this paragraph not being relevant to the printed manual).
                     33: 
                     34: @end ignore
                     35: Permission is granted to copy and distribute modified versions of this
                     36: manual under the conditions for verbatim copying, provided also that the
                     37: entire resulting derived work is distributed under the terms of a
                     38: permission notice identical to this one.
                     39: 
                     40: Permission is granted to copy and distribute translations of this manual
                     41: into another language, under the above conditions for modified versions.
                     42: @end ifinfo
                     43: 
                     44: @finalout
                     45: @syncodeindex fn cp
                     46: @syncodeindex vr cp
                     47: 
                     48: @titlepage
                     49: @title The GNU C++ Iostream Library
                     50: @subtitle Reference Manual for @code{libio} Version 0.50
                     51: @sp 3
                     52: @author Per Bothner @hfill @code{bothner@@cygnus.com}
                     53: @author Roland Pesch @hfill @code{pesch@@cygnus.com}
                     54: @page
                     55: 
                     56: @vskip 0pt plus 1filll
                     57: Copyright @copyright{} 1993 Free Software Foundation, Inc.
                     58: 
                     59: @code{libio} includes software developed by the University of
                     60: California, Berkeley.
                     61: 
                     62: @code{libio} uses floating-point software written by David M. Gay, which
                     63: includes the following notice:
                     64: 
                     65: @quotation
                     66: The author of this software is David M. Gay.
                     67: 
                     68: Copyright (c) 1991 by AT&T.
                     69: 
                     70: Permission to use, copy, modify, and distribute this software for any
                     71: purpose without fee is hereby granted, provided that this entire notice
                     72: is included in all copies of any software which is or includes a copy
                     73: or modification of this software and in all copies of the supporting
                     74: documentation for such software.
                     75: 
                     76: THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
                     77: WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY
                     78: REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
                     79: OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
                     80: @end quotation
                     81: 
                     82: Permission is granted to make and distribute verbatim copies of
                     83: this manual provided the copyright notice and this permission notice
                     84: are preserved on all copies.
                     85: 
                     86: Permission is granted to copy and distribute modified versions of this
                     87: manual under the conditions for verbatim copying, provided also that the
                     88: entire resulting derived work is distributed under the terms of a
                     89: permission notice identical to this one.
                     90: 
                     91: Permission is granted to copy and distribute translations of this manual
                     92: into another language, under the above conditions for modified versions.
                     93: @end titlepage
                     94: 
                     95: @ifinfo
                     96: @node Top
                     97: @top The GNU C++ Iostream Library
                     98: 
                     99: This file provides reference information on the GNU C++ iostream library
                    100: (@code{libio}), version 0.50.
                    101: 
                    102: @menu
                    103: * Introduction::
                    104: * Operators::                  Operators and default streams.
                    105: * Streams::                    Stream classes.
                    106: * Files and Strings::          Classes for files and strings.
                    107: * Streambuf::                  Using the streambuf layer.
                    108: * Stdio::                      C input and output.
                    109: * Index::
                    110: @end menu
                    111: @end ifinfo
                    112: 
                    113: @node Introduction
                    114: @chapter Introduction
                    115: 
                    116: The iostream classes implement most of the features of AT&T version 2.0
                    117: iostream library classes, and most of the features of the ANSI X3J16
                    118: library draft (which is based on the AT&T design).
                    119: 
                    120: This manual is meant as a reference; for tutorial material on iostreams,
                    121: see the corresponding section of any recent popular introduction to C++.
                    122: 
                    123: @menu
                    124: * Copying::            Special GNU licensing terms for libio.
                    125: * Acknowledgements::   Contributors to GNU iostream.
                    126: @end menu
                    127: 
                    128: @node Copying
                    129: @section Licensing terms for @code{libio}
                    130: 
                    131: Since the @code{iostream} classes are so fundamental to standard C++,
                    132: the Free Software Foundation has agreed to a special exception to its
                    133: standard license, when you link programs with @code{libio.a}:
                    134: 
                    135: @quotation
                    136: As a special exception, if you link this library with files
                    137: compiled with a GNU compiler to produce an executable, this does not cause
                    138: the resulting executable to be covered by the GNU General Public License.
                    139: This exception does not however invalidate any other reasons why
                    140: the executable file might be covered by the GNU General Public License.
                    141: @end quotation
                    142: 
                    143: The code is under the @sc{gnu} General Public License (version 2) for
                    144: all other purposes than linking with this library; that means that you
                    145: can modify and redistribute the code as usual, but remember that if you
                    146: do, your modifications, and anything you link with the modified code,
                    147: must be available to others on the same terms.
                    148: 
                    149: These functions are also available as part of the @code{libg++}
                    150: library; if you link with that library instead of @code{libio}, the
                    151: @sc{gnu} Library General Public License applies.
                    152: 
                    153: @node Acknowledgements
                    154: @section Acknowledgements
                    155: 
                    156: Per Bothner wrote most of the @code{iostream} library, but some portions
                    157: have their origins elsewhere in the free software community.  Heinz
                    158: Seidl wrote the IO manipulators.  The floating-point conversion software
                    159: is by David M. Gay of AT&T.  Some code was derived from parts of BSD
                    160: 4.4, which was written at the University of California, Berkeley.
                    161: 
                    162: The iostream classes are found in the @code{libio} library.  An early
                    163: version was originally distributed in @code{libg++}, and they are still
                    164: included there as well, for convenience if you need other @code{libg++}
                    165: classes.  Doug Lea was the original author of @code{libg++}, and some of
                    166: the file-management code still in @code{libio} is his.
                    167: 
                    168: Various people found bugs or offered suggestions.  Hongjiu Lu worked
                    169: hard to use the library as the default stdio implementation for Linux,
                    170: and has provided much stress-testing of the library.
                    171: 
                    172: @node Operators
                    173: @chapter Operators and Default Streams
                    174: 
                    175: The @sc{gnu} iostream library, @file{libio}, implements the standard
                    176: input and output facilities for C++.  These facilities are roughly
                    177: analogous (in their purpose and ubiquity, at least) with those defined
                    178: by the C @file{stdio} functions.
                    179: 
                    180: Although these definitions come from a library, rather than being part
                    181: of the ``core language'', they are sufficiently central to be specified
                    182: in the latest working papers for C++.
                    183: 
                    184: You can use two operators defined in this library for basic input and
                    185: output operations.  They are familiar from any C++ introductory
                    186: textbook: @code{<<} for output, and @code{>>} for input.  (Think of data
                    187: flowing in the direction of the ``arrows''.)
                    188: 
                    189: These operators are often used in conjunction with three streams that
                    190: are open by default: 
                    191: 
                    192: @deftypevar ostream cout
                    193: The standard output stream, analogous to the C @code{stdout}.
                    194: @end deftypevar
                    195: 
                    196: @deftypevar istream cin
                    197: The standard input stream, analogous to the C @code{stdin}.
                    198: @end deftypevar
                    199: 
                    200: @deftypevar ostream cerr
                    201: An alternative output stream for errors, analogous to the C
                    202: @code{stderr}.
                    203: @end deftypevar
                    204: 
                    205: @noindent
                    206: For example, this bare-bones C++ version of the traditional ``hello''
                    207: program uses @code{<<} and @code{cout}:
                    208: 
                    209: @example
                    210: #include <iostream.h>
                    211: 
                    212: int main(int argc, char **argv)
                    213: @{
                    214:   cout << "Well, hi there.\n";
                    215:   return 0;
                    216: @}
                    217: @end example
                    218: 
                    219: Casual use of these operators may be seductive, but---other than in
                    220: writing throwaway code for your own use---it is not necessarily simpler
                    221: than managing input and output in any other language.  For example,
                    222: robust code should check the state of the input and output streams
                    223: between operations (for example, using the method @code{good}).
                    224: @xref{States,,Checking the state of a stream}.  You may also need to
                    225: adjust maximum input or output field widths, using manipulators like
                    226: @code{setw} or @code{setprecision}.
                    227: 
                    228: @defop Operator ostream <<
                    229: Write output to an open output stream of class @code{ostream}.
                    230: Defined by this library on any @var{object} of a C++ primitive type, and
                    231: on other classes of the library.  You can overload the definition for any
                    232: of your own applications' classes.
                    233: 
                    234: Returns a reference to the implied argument @code{*this} (the open stream it
                    235: writes on), permitting statements like
                    236: @example
                    237: cout << "The value of i is " << i << "\n";
                    238: @end example
                    239: @end defop
                    240: 
                    241: @defop Operator istream >>
                    242: Read input from an open input stream of class @code{istream}.  Defined
                    243: by this library on primitive numeric, pointer, and string types; you can
                    244: extend the definition for any of your own applications' classes.
                    245: 
                    246: Returns a reference to the implied argument @code{*this} (the open stream
                    247: it reads), permitting multiple inputs in one statement.
                    248: @end defop
                    249: 
                    250: @node Streams
                    251: @chapter Stream Classes
                    252: 
                    253: The previous chapter referred in passing to the classes @code{ostream}
                    254: and @code{istream}, for output and input respectively.  These classes
                    255: share certain properties, captured in their base class @code{ios}.
                    256: 
                    257: @menu
                    258: * Ios::       Shared properties.
                    259: * Ostream::   Managing output streams.
                    260: * Istream::   Managing input streams.
                    261: * Iostream::  Input and output together.
                    262: @end menu
                    263: 
                    264: @node Ios
                    265: @section Shared properties: class @code{ios}
                    266: 
                    267: The base class @code{ios} provides methods to test and manage the state
                    268: of input or output streams.
                    269: 
                    270: @code{ios} delegates the job of actually reading and writing bytes to
                    271: the abstract class @code{streambuf}, which is designed to provide
                    272: buffered streams (compatible with C, in the @sc{gnu} implementation).
                    273: @xref{Streambuf,,Using the @code{streambuf} layer}, for information on
                    274: the facilities available at the @code{streambuf} level.
                    275: 
                    276: @deftypefn Constructor {} ios::ios ([streambuf* @var{sb} @w{[, ostream*} @var{tie}])
                    277: The @code{ios} constructor by default initializes a new @code{ios}, and
                    278: if you supply a @code{streambuf} @var{sb} to associate with it, sets the
                    279: state @code{good} in the new @code{ios} object.  It also sets the
                    280: default properties of the new object.
                    281: 
                    282: @ignore
                    283: @c FIXME--future: this (a) doesn't work, (b) is controversial at ANSI
                    284: An @code{ios} without a @code{streambuf} has the state @code{bad} until
                    285: you supply a @code{streambuf}; you can do that by assigning a new value
                    286: to the @code{ios} with @samp{=}.
                    287: @end ignore
                    288: 
                    289: You can also supply an optional second argument @var{tie} to the
                    290: constructor: if present, it is an initial value for @code{ios::tie}, to
                    291: associate the new @code{ios} object with another stream.
                    292: @end deftypefn
                    293: 
                    294: @deftypefn Destructor {} ios::~ios ()
                    295: The @code{ios} destructor is virtual, permitting application-specific
                    296: behavior when a stream is closed---typically, the destructor frees any
                    297: storage associated with the stream and releases any other associated
                    298: objects.
                    299: @end deftypefn
                    300: 
                    301: @c FIXME-future:  Is @deftypefn really the best way of displaying these?
                    302: 
                    303: @c FIXME-future: Undocumented: ios::_throw_failure, ios::exceptions; things
                    304: @c controlled by _STREAM_COMPAT; ios::Init; ios::_IO_fix_vtable.
                    305: 
                    306: @menu
                    307: * States::             Checking the state of a stream.
                    308: * Format Control::     Choices in formatting.
                    309: * Manipulators::       Convenient ways of changing stream properties.
                    310: * Extending::          Extended data fields.
                    311: * Synchronization::    Synchronizing related streams.
                    312: * Streambuf from Ios:: Reaching the underlying streambuf.
                    313: @end menu
                    314: 
                    315: @node States
                    316: @subsection Checking the state of a stream
                    317: 
                    318: Use this collection of methods to test for (or signal) errors and other
                    319: exceptional conditions of streams:
                    320: 
                    321: @deftypefn Method {ios::operator void*} () const
                    322: You can do a quick check on the state of the most recent operation on a
                    323: stream by examining a pointer to the stream itself.  The pointer is
                    324: arbitrary except for its truth value; it is true if no failures have
                    325: occurred (@code{ios::fail} is not true).  For example, you might ask for
                    326: input on @code{cin} only if all prior output operations succeeded:
                    327: 
                    328: @example
                    329: if (cout)
                    330: @{
                    331:   // Everything OK so far
                    332:   cin >> new_value;
                    333:   @dots{}
                    334: @}
                    335: @end example
                    336: @end deftypefn
                    337: 
                    338: @deftypefn Method {ios::operator !} () const
                    339: In case it is more convenient to check whether something has failed, the
                    340: operator @code{!} returns true if @code{ios::fail} is true (an operation
                    341: has failed).  For example,
                    342: you might issue an error message if input failed:
                    343: 
                    344: @example
                    345: if (!cin)
                    346: @{
                    347:   // Oops
                    348:   cerr << "Eh?\n";
                    349: @}
                    350: @end example
                    351: @end deftypefn
                    352: 
                    353: @deftypefn Method iostate ios::rdstate () const
                    354: Return the state flags for this stream.  The value is from the
                    355: enumeration @code{iostate}.  You can test for any combination of
                    356: 
                    357: @vtable @code
                    358: @item goodbit
                    359: There are no indications of exceptional states on this stream.
                    360: 
                    361: @item eofbit
                    362: End of file.
                    363: 
                    364: @item failbit
                    365: An operation has failed on this stream; this usually indicates bad
                    366: format of input.
                    367: 
                    368: @item badbit
                    369: The stream is unusable.
                    370: @end vtable
                    371: @end deftypefn
                    372: 
                    373: @deftypefn Method void ios::setstate (iostate @var{state})
                    374: @findex ios::set
                    375: Set the state flag for this stream to @var{state} @emph{in addition to}
                    376: any state flags already set.  Synonym (for upward compatibility):
                    377: @code{ios::set}.
                    378: 
                    379: See @code{ios::clear} to set the stream state without regard to existing
                    380: state flags.  See @code{ios::good}, @code{ios::eof}, @code{ios::fail},
                    381: and @code{ios::bad}, to test the state.
                    382: @end deftypefn
                    383: 
                    384: @deftypefn Method int ios::good () const
                    385: Test the state flags associated with this stream; true if no error
                    386: indicators are set.
                    387: @end deftypefn
                    388: 
                    389: @deftypefn Method int ios::bad () const
                    390: Test whether a stream is marked as unusable.  (Whether
                    391: @code{ios::badbit} is set.)
                    392: @end deftypefn
                    393: 
                    394: @deftypefn Method int ios::eof () const
                    395: True if end of file was reached on this stream.  (If @code{ios::eofbit}
                    396: is set.)
                    397: @end deftypefn
                    398: 
                    399: @deftypefn Method int ios::fail () const
                    400: Test for any kind of failure on this stream: @emph{either} some
                    401: operation failed, @emph{or} the stream is marked as bad.  (If either
                    402: @code{ios::failbit} or @code{ios::badbit} is set.)
                    403: @end deftypefn
                    404: 
                    405: @deftypefn Method void ios::clear (iostate @var{state})
                    406: @c FIXME-future: There is some complication to do with buffering and _throw_failure
                    407: Set the state indication for this stream to the argument @var{state}.
                    408: You may call @code{ios::clear} with no argument, in which case the state
                    409: is set to @code{good} (no errors pending).
                    410: 
                    411: See @code{ios::good}, @code{ios::eof}, @code{ios::fail}, and
                    412: @code{ios::bad}, to test the state; see @code{ios::set} or
                    413: @code{ios::setstate} for an alternative way of setting the state.
                    414: @end deftypefn
                    415: 
                    416: @node Format Control
                    417: @subsection Choices in formatting
                    418: 
                    419: These methods control (or report on) settings for some details of
                    420: controlling streams, primarily to do with formatting output:
                    421: 
                    422: @deftypefn Method char ios::fill () const
                    423: Report on the padding character in use.
                    424: @end deftypefn
                    425: 
                    426: @deftypefn Method char ios::fill (char @var{padding})
                    427: Set the padding character.  You can also use the manipulator
                    428: @code{setfill}.  @xref{Manipulators,,Changing stream properties in
                    429: expressions}.
                    430: 
                    431: Default: blank.
                    432: @end deftypefn
                    433: 
                    434: @deftypefn Method int ios::precision () const
                    435: Report the number of significant digits currently in use for output of
                    436: floating point numbers.
                    437: 
                    438: Default: @code{6}.
                    439: @end deftypefn
                    440: 
                    441: @deftypefn Method int ios::precision (int @var{signif})
                    442: Set the number of significant digits (for input and output numeric
                    443: conversions) to @var{signif}.
                    444: 
                    445: @findex setprecision
                    446: @cindex setting @code{ios::precision}
                    447: You can also use the manipulator @code{setprecision} for this purpose.
                    448: @xref{Manipulators,,Changing stream properties using manipulators}.
                    449: @end deftypefn
                    450: 
                    451: @deftypefn Method int ios::width () const
                    452: Report the current output field width setting (the number of
                    453: characters to write on the next @samp{<<} output operation).
                    454: 
                    455: Default: @code{0}, which means to use as many characters as necessary.
                    456: @end deftypefn
                    457: 
                    458: @deftypefn Method int ios::width (int @var{num})
                    459: Set the input field width setting to @var{num}.  Return the
                    460: @emph{previous} value for this stream.
                    461: 
                    462: @findex setw
                    463: @cindex setting @code{ios::width}
                    464: This value resets to zero (the default) every time you use @samp{<<}; it is
                    465: essentially an additional implicit argument to that operator.  You can
                    466: also use the manipulator @code{setw} for this purpose.
                    467: @xref{Manipulators,,Changing stream properties using manipulators}.
                    468: @end deftypefn
                    469: 
                    470: @need 2000
                    471: @deftypefn Method fmtflags ios::flags () const
                    472: Return the current value of the complete collection of flags controlling
                    473: the format state.  These are the flags and their meanings when set:
                    474: 
                    475: @vtable @code
                    476: @item ios::dec
                    477: @itemx ios::oct
                    478: @itemx ios::hex
                    479: What numeric base to use in converting integers from internal to display
                    480: representation, or vice versa: decimal, octal, or hexadecimal,
                    481: respectively.  (You can change the base using the manipulator
                    482: @code{setbase}, or any of the manipulators @code{dec}, @code{oct}, or
                    483: @code{hex}; @pxref{Manipulators,,Changing stream properties in
                    484: expressions}.)
                    485: 
                    486: On input, if none of these flags is set, read numeric constants
                    487: according to the prefix: decimal if no prefix (or a @samp{.} suffix),
                    488: octal if a @samp{0} prefix is present, hexadecimal if a @samp{0x} prefix
                    489: is present.
                    490: 
                    491: Default: @code{dec}.
                    492: 
                    493: @item ios::fixed
                    494: Avoid scientific notation, and always show a fixed number of digits after
                    495: the decimal point, according to the output precision in effect.
                    496: Use @code{ios::precision} to set precision.
                    497: 
                    498: @item ios::left
                    499: @itemx ios::right
                    500: @itemx ios::internal
                    501: Where output is to appear in a fixed-width field; left-justified,
                    502: right-justified, or with padding in the middle (e.g. between a numeric
                    503: sign and the associated value), respectively.
                    504: 
                    505: @item ios::scientific
                    506: Use scientific (exponential) notation to display numbers.
                    507: 
                    508: @item ios::showbase
                    509: Display the conventional prefix as a visual indicator of the conversion
                    510: base: no prefix for decimal, @samp{0} for octal, @samp{0x} for hexadecimal.
                    511: 
                    512: @item ios::showpoint
                    513: Display a decimal point and trailing zeros after it to fill out numeric
                    514: fields, even when redundant.
                    515: 
                    516: @item ios::showpos
                    517: Display a positive sign on display of positive numbers.
                    518: 
                    519: @item ios::skipws
                    520: Skip white space.  (On by default).
                    521: 
                    522: @item ios::stdio
                    523: Flush the C @code{stdio} streams @code{stdout} and @code{stderr} after
                    524: each output operation (for programs that mix C and C++ output conventions).
                    525: 
                    526: @item ios::unitbuf
                    527: Flush after each output operation.
                    528: 
                    529: @item ios::uppercase
                    530: Use upper-case characters for the non-numeral elements in numeric
                    531: displays; for instance, @samp{0X7A} rather than @samp{0x7a}, or
                    532: @samp{3.14E+09} rather than @samp{3.14e+09}.
                    533: @end vtable
                    534: @end deftypefn
                    535: 
                    536: @deftypefn Method fmtflags ios::flags (fmtflags @var{value})
                    537: Set @var{value} as the complete collection of flags controlling the
                    538: format state.  The flag values are described under @samp{ios::flags ()}.
                    539: 
                    540: Use @code{ios::setf} or @code{ios::unsetf} to change one property at a
                    541: time.
                    542: @end deftypefn
                    543: 
                    544: @deftypefn Method fmtflags ios::setf (fmtflags @var{flag})
                    545: Set one particular flag (of those described for @samp{ios::flags ()};
                    546: return the complete collection of flags @emph{previously} in effect.
                    547: (Use @code{ios::unsetf} to cancel.)
                    548: @end deftypefn
                    549: 
                    550: @deftypefn Method fmtflags ios::setf (fmtflags @var{flag}, fmtflags @var{mask})
                    551: Clear the flag values indicated by @var{mask}, then set any of them that
                    552: are also in @var{flag}.  (Flag values are described for @samp{ios::flags
                    553: ()}.)  Return the complete collection of flags @emph{previously} in
                    554: effect.  (See @code{ios::unsetf} for another way of clearing flags.)
                    555: @end deftypefn
                    556: 
                    557: @deftypefn Method fmtflags ios::unsetf (fmtflags @var{flag})
                    558: Make certain @var{flag} (a combination of flag values described for
                    559: @samp{ios::flags ()}) is not set for this stream; converse of
                    560: @code{ios::setf}.  Returns the old values of those flags.
                    561: @c FIXME-future: should probably be fixed to give same result as setf.
                    562: @end deftypefn
                    563: 
                    564: @node Manipulators
                    565: @subsection Changing stream properties using manipulators
                    566: 
                    567: For convenience, @var{manipulators} provide a way to change certain
                    568: properties of streams, or otherwise affect them, in the middle of
                    569: expressions involving @samp{<<} or @samp{>>}.  For example, you might
                    570: write
                    571: 
                    572: @example
                    573: cout << "|" << setfill('*') << setw(5) << 234 << "|";
                    574: @end example
                    575: 
                    576: @noindent
                    577: to produce @samp{|**234|} as output.
                    578: 
                    579: @deftypefn Manipulator {} ws
                    580: Skip whitespace.
                    581: @end deftypefn
                    582: 
                    583: @deftypefn Manipulator {} flush
                    584: Flush an output stream.  For example, @samp{cout << @dots{} <<flush;}
                    585: has the same effect as @samp{cout << @dots{}; cout.flush();}.
                    586: @end deftypefn
                    587: 
                    588: @deftypefn Manipulator {} endl
                    589: Write an end of line character @samp{\n}, then flushes the output stream.
                    590: @end deftypefn
                    591: 
                    592: @deftypefn Manipulator {} ends
                    593: Write @samp{\0} (the string terminator character).
                    594: @end deftypefn
                    595: 
                    596: @deftypefn Manipulator {} setprecision (int @var{signif})
                    597: You can change the value of @code{ios::precision} in @samp{<<}
                    598: expressions with the manipulator @samp{setprecision(@var{signif})}; for
                    599: example,
                    600: 
                    601: @example
                    602: cout << setprecision(2) << 4.567;
                    603: @end example
                    604: 
                    605: @noindent
                    606: prints @samp{4.6}.  Requires @file{#include <iomanip.h>}.
                    607: @end deftypefn
                    608: 
                    609: @deftypefn Manipulator {} setw (int @var{n})
                    610: You can change the value of @code{ios::width} in @samp{<<} expressions
                    611: with the manipulator @samp{setw(@var{n})}; for example,
                    612: 
                    613: @example
                    614: cout << setw(5) << 234;
                    615: @end example
                    616: 
                    617: @noindent
                    618: prints @w{@samp{  234}} with two leading blanks.  Requires @file{#include
                    619: <iomanip.h>}.
                    620: @end deftypefn
                    621: 
                    622: @deftypefn Manipulator {} setbase (int @var{base})
                    623: Where @var{base} is one of @code{10} (decimal), @code{8} (octal), or
                    624: @code{16} (hexadecimal), change the base value for numeric
                    625: representations.  Requires @file{#include <iomanip.h>}.
                    626: @end deftypefn
                    627: 
                    628: @deftypefn Manipulator {} dec
                    629: Select decimal base; equivalent to @samp{setbase(10)}.
                    630: @end deftypefn
                    631: 
                    632: @deftypefn Manipulator {} hex
                    633: Select hexadecimal base; equivalent to @samp{setbase(16)}.
                    634: @end deftypefn
                    635: 
                    636: @deftypefn Manipulator {} oct
                    637: Select octal base; equivalent to @samp{setbase(8)}.
                    638: @end deftypefn
                    639: 
                    640: @deftypefn Manipulator {} setfill (char @var{padding})
                    641: Set the padding character, in the same way as @code{ios::fill}.
                    642: Requires @file{#include <iomanip.h>}.
                    643: @end deftypefn
                    644: 
                    645: @node Extending
                    646: @subsection Extended data fields
                    647: 
                    648: A related collection of methods allows you to extend this collection of
                    649: flags and parameters for your own applications, without risk of conflict
                    650: between them:
                    651: 
                    652: @deftypefn Method {static fmtflags} ios::bitalloc ()
                    653: Reserve a bit (the single bit on in the result) to use as a flag.  Using
                    654: @code{bitalloc} guards against conflict between two packages that use
                    655: @code{ios} objects for different purposes.
                    656: 
                    657: This method is available for upward compatibility, but is not in the
                    658: @sc{ansi} working paper.  The number of bits available is limited; a
                    659: return value of @code{0} means no bit is available.
                    660: @end deftypefn
                    661: 
                    662: @deftypefn Method {static int} ios::xalloc ()
                    663: Reserve space for a long integer or pointer parameter.  The result is a
                    664: unique nonnegative integer.  You can use it as an index to
                    665: @code{ios::iword} or @code{ios::pword}.  Use @code{xalloc} to arrange
                    666: for arbitrary special-purpose data in your @code{ios} objects, without
                    667: risk of conflict between packages designed for different purposes.
                    668: @end deftypefn
                    669: 
                    670: @deftypefn Method long& ios::iword (int @var{index})
                    671: Return a reference to arbitrary data, of long integer type, stored in an
                    672: @code{ios} instance.  @var{index}, conventionally returned from
                    673: @code{ios::xalloc}, identifies what particular data you need.
                    674: @end deftypefn
                    675: 
                    676: @deftypefn Method long ios::iword (int @var{index}) const
                    677: Return the actual value of a long integer stored in an @code{ios}.
                    678: @end deftypefn
                    679: 
                    680: @deftypefn Method void*& ios::pword (int @var{index})
                    681: Return a reference to an arbitrary pointer, stored in an @code{ios}
                    682: instance.  @var{index}, originally returned from @code{ios::xalloc},
                    683: identifies what particular pointer you need.
                    684: @end deftypefn
                    685: 
                    686: @deftypefn Method void* ios::pword (int @var{index}) const
                    687: Return the actual value of a pointer stored in an @code{ios}.
                    688: @end deftypefn
                    689: 
                    690: @node Synchronization
                    691: @subsection Synchronizing related streams
                    692: 
                    693: You can use these methods to synchronize related streams with
                    694: one another:
                    695: 
                    696: @deftypefn Method ostream* ios::tie () const
                    697: Report on what output stream, if any, is to be flushed before accessing
                    698: this one.  A pointer value of @code{0} means no stream is tied.
                    699: @end deftypefn
                    700: 
                    701: @deftypefn Method ostream* ios::tie (ostream* @var{assoc})
                    702: Declare that output stream @var{assoc} must be flushed before accessing
                    703: this stream.
                    704: @end deftypefn
                    705: 
                    706: @deftypefn Method int ios::sync_with_stdio ([int @var{switch}])
                    707: Unless iostreams and C @code{stdio} are designed to work together, you
                    708: may have to choose between efficient C++ streams output and output
                    709: compatible with C @code{stdio}.  Use @samp{ios::sync_with_stdio()} to
                    710: select C compatibility.
                    711: 
                    712: The argument @var{switch} is a @sc{gnu} extension; use @code{0} as the
                    713: argument to choose output that is not necessarily compatible with C
                    714: @code{stdio}.  The default value for @var{switch} is @code{1}.
                    715: 
                    716: If you install the @code{stdio} implementation that comes with @sc{gnu}
                    717: @code{libio}, there are compatible input/output facilities for both C
                    718: and C++.  In that situation, this method is unnecessary---but you may
                    719: still want to write programs that call it, for portability.
                    720: @end deftypefn
                    721: 
                    722: @node Streambuf from Ios
                    723: @subsection Reaching the underlying @code{streambuf}
                    724: 
                    725: Finally, you can use this method to access the underlying object:
                    726: 
                    727: @deftypefn Method streambuf* ios::rdbuf () const
                    728: Return a pointer to the @code{streambuf} object that underlies this
                    729: @code{ios}.
                    730: @end deftypefn
                    731: 
                    732: @node Ostream
                    733: @section Managing output streams: class @code{ostream}
                    734: 
                    735: Objects of class @code{ostream} inherit the generic methods from
                    736: @code{ios}, and in addition have the following methods available.
                    737: Declarations for this class come from @file{iostream.h}.
                    738: 
                    739: @deftypefn Constructor {} ostream::ostream ()
                    740: The simplest form of the constructor for an @code{ostream} simply
                    741: allocates a new @code{ios} object.
                    742: @end deftypefn
                    743: 
                    744: @deftypefn Constructor {} ostream::ostream (streambuf* @var{sb} @w{[, ostream} @var{tie}])
                    745: This alternative constructor requires a first argument @var{sb} of type
                    746: @code{streambuf*}, to use an existing open stream for output.  It also
                    747: accepts an optional second argument @var{tie}, to specify a related
                    748: @code{ostream*} as the initial value for @code{ios::tie}.
                    749: 
                    750: If you give the @code{ostream} a @code{streambuf} explicitly, using
                    751: this constructor, the @var{sb} is @emph{not} destroyed (or deleted or
                    752: closed) when the @code{ostream} is destroyed.
                    753: @end deftypefn
                    754: 
                    755: @menu
                    756: * Writing::            Writing on an ostream.
                    757: * Output Position::    Repositioning an ostream.
                    758: * Ostream Housekeeping:: Miscellaneous ostream utilities.
                    759: @end menu
                    760: 
                    761: @node Writing
                    762: @subsection Writing on an @code{ostream}
                    763: 
                    764: These methods write on an @code{ostream} (you may also use the operator
                    765: @code{<<}; @pxref{Operators,,Operators and Default Streams}).
                    766: 
                    767: @deftypefn Method ostream& ostream::put (char @var{c})
                    768: Write the single character @var{c}.
                    769: @end deftypefn
                    770: 
                    771: @deftypefn Method ostream& ostream::write (@var{string}, int @var{length})
                    772: Write @var{length} characters of a string to this @code{ostream},
                    773: beginning at the pointer @var{string}.
                    774: 
                    775: @var{string} may have any of these types: @code{char*}, @code{unsigned
                    776: char*}, @code{signed char*}.
                    777: @end deftypefn
                    778: 
                    779: @deftypefn Method ostream& ostream::form (const char *@var{format}, ...)
                    780: A @sc{gnu} extension, similar to @code{fprintf(@var{file},
                    781: @var{format}, ...)}.
                    782: 
                    783: @var{format} is a @code{printf}-style format control string, which is used
                    784: to format the (variable number of) arguments, printing the result on
                    785: this @code{ostream}.  See @code{ostream::vform} for a version that uses
                    786: an argument list rather than a variable number of arguments.
                    787: @end deftypefn
                    788: 
                    789: @deftypefn Method ostream& ostream::vform (const char *@var{format}, va_list @var{args})
                    790: A @sc{gnu} extension, similar to @code{vfprintf(@var{file},
                    791: @var{format}, @var{args})}.
                    792: 
                    793: @var{format} is a @code{printf}-style format control string, which is used
                    794: to format the argument list @var{args}, printing the result on
                    795: this @code{ostream}.  See @code{ostream::form} for a version that uses a
                    796: variable number of arguments rather than an argument list.
                    797: @end deftypefn
                    798: 
                    799: @node Output Position
                    800: @subsection Repositioning an @code{ostream}
                    801: 
                    802: You can control the output position (on output streams that actually
                    803: support positions, typically files) with these methods:
                    804: @c FIXME-future: sort out which classes support this and which
                    805: @c don't; fstream, filebuf?  And what is failure condition when not supported?
                    806: 
                    807: @deftypefn Method streampos ostream::tellp ()
                    808: Return the current write position in the stream.
                    809: @end deftypefn
                    810: 
                    811: @deftypefn Method ostream& ostream::seekp (streampos @var{loc})
                    812: Reset the output position to @var{loc} (which is usually the result of a
                    813: previous call to @code{ostream::tellp}).  @var{loc} specifies an
                    814: absolute position in the output stream.
                    815: @end deftypefn
                    816: 
                    817: @deftypefn Method ostream& ostream::seekp (streamoff @var{loc}, @var{rel})
                    818: @findex ios::seekdir
                    819: Reset the output position to @var{loc}, relative to the beginning, end,
                    820: or current output position in the stream, as indicated by @var{rel} (a
                    821: value from the enumeration @code{ios::seekdir}):
                    822: 
                    823: @vtable @code
                    824: @item beg
                    825: Interpret @var{loc} as an absolute offset from the beginning of the
                    826: file.
                    827: 
                    828: @item cur
                    829: Interpret @var{loc} as an offset relative to the current output
                    830: position.
                    831: 
                    832: @item end
                    833: Interpret @var{loc} as an offset from the current end of the output
                    834: stream.
                    835: @end vtable
                    836: @end deftypefn
                    837: 
                    838: @node Ostream Housekeeping
                    839: @subsection Miscellaneous @code{ostream} utilities
                    840: 
                    841: You may need to use these @code{ostream} methods for housekeeping:
                    842: 
                    843: @deftypefn Method ostream& flush ()
                    844: Deliver any pending buffered output for this @code{ostream}.
                    845: @end deftypefn
                    846: 
                    847: @deftypefn Method int ostream::opfx ()
                    848: @code{opfx} is a @dfn{prefix} method for operations on @code{ostream}
                    849: objects; it is designed to be called before any further processing.  See
                    850: @code{ostream::osfx} for the converse.
                    851: @c FIXME-future: specify sometime which methods start with opfx.
                    852: 
                    853: @code{opfx} tests that the stream is in state @code{good}, and if so
                    854: flushes any stream tied to this one.
                    855: 
                    856: The result is @code{1} when @code{opfx} succeeds; else (if the stream state is
                    857: not @code{good}), the result is @code{0}.
                    858: @end deftypefn
                    859: 
                    860: @deftypefn Method void ostream::osfx ()
                    861: @code{osfx} is a @dfn{suffix} method for operations on @code{ostream}
                    862: objects; it is designed to be called at the conclusion of any processing.  All
                    863: the @code{ostream} methods end by calling @code{osfx}.  See
                    864: @code{ostream::opfx} for the converse.
                    865: 
                    866: If the @code{unitbuf} flag is set for this stream, @code{osfx} flushes
                    867: any buffered output for it.
                    868: 
                    869: If the @code{stdio} flag is set for this stream, @code{osfx} flushes any
                    870: output buffered for the C output streams @file{stdout} and @file{stderr}.
                    871: @end deftypefn
                    872: 
                    873: @node Istream
                    874: @section Managing input streams: class @code{istream}
                    875: 
                    876: Class @code{istream} objects are specialized for input; as for
                    877: @code{ostream}, they are derived from @code{ios}, so you can use any of
                    878: the general-purpose methods from that base class.  Declarations for this
                    879: class also come from @file{iostream.h}.
                    880: 
                    881: @deftypefn Constructor {} istream::istream ()
                    882: When used without arguments, the @code{istream} constructor simply
                    883: allocates a new @code{ios} object and initializes the input counter (the
                    884: value reported by @code{istream::gcount}) to @code{0}.
                    885: @end deftypefn
                    886: 
                    887: @deftypefn Constructor {} istream::istream (streambuf *@var{sb} @w{[, ostream} @var{tie}])
                    888: You can also call the constructor with one or two arguments.  The first
                    889: argument @var{sb} is a @code{streambuf*}; if you supply this pointer,
                    890: the constructor uses that @code{streambuf} for input.
                    891: You can use the second optional argument @var{tie} to specify a related
                    892: output stream as the initial value for @code{ios::tie}.
                    893: 
                    894: If you give the @code{istream} a @code{streambuf} explicitly, using
                    895: this constructor, the @var{sb} is @emph{not} destroyed (or deleted or
                    896: closed) when the @code{ostream} is destroyed.
                    897: @end deftypefn
                    898: 
                    899: @menu
                    900: * Char Input::         Reading one character.
                    901: * String Input::       Reading strings.
                    902: * Input Position::     Repositioning an istream.
                    903: * Istream Housekeeping:: Miscellaneous istream utilities.
                    904: @end menu
                    905: 
                    906: @node Char Input
                    907: @subsection Reading one character
                    908: 
                    909: Use these methods to read a single character from the input stream:
                    910: 
                    911: @deftypefn Method int istream::get ()
                    912: Read a single character (or @code{EOF}) from the input stream, returning
                    913: it (coerced to an unsigned char) as the result.
                    914: @end deftypefn
                    915: 
                    916: @deftypefn Method istream& istream::get (char& @var{c})
                    917: Read a single character from the input stream, into @code{&@var{c}}.
                    918: @end deftypefn
                    919: 
                    920: @deftypefn Method int istream::peek ()
                    921: Return the next available input character, but @emph{without} changing
                    922: the current input position.
                    923: @end deftypefn
                    924: 
                    925: @node String Input
                    926: @subsection Reading strings
                    927: 
                    928: Use these methods to read strings (for example, a line at a time) from
                    929: the input stream:
                    930: 
                    931: @deftypefn Method istream& istream::get (char* @var{c}, int @var{len} @w{[, char} @var{delim}])
                    932: Read a string from the input stream, into the array at @var{c}.
                    933: 
                    934: The remaining arguments limit how much to read: up to @samp{len-1}
                    935: characters, or up to (but not including) the first occurrence in the
                    936: input of a particular delimiter character @var{delim}---newline
                    937: (@code{\n}) by default.  (Naturally, if the stream reaches end of file
                    938: first, that too will terminate reading.)
                    939: 
                    940: If @var{delim} was present in the input, it remains available as if
                    941: unread; to discard it instead, see @code{iostream::getline}.
                    942: 
                    943: @code{get} writes @samp{\0} at the end of the string, regardless
                    944: of which condition terminates the read.
                    945: @end deftypefn
                    946: 
                    947: @deftypefn Method istream& istream::get (streambuf& @var{sb} @w{[, char} @var{delim}])
                    948: Read characters from the input stream and copy them on the
                    949: @code{streambuf} object @var{sb}.  Copying ends either just before the
                    950: next instance of the delimiter character @var{delim} (newline @code{\n}
                    951: by default), or when either stream ends.   If @var{delim} was present in
                    952: the input, it remains available as if unread.
                    953: @end deftypefn
                    954: 
                    955: @deftypefn Method istream& istream::getline (@var{charptr}, int @var{len} @w{[, char} @var{delim}])
                    956: Read a line from the input stream, into the array at @var{charptr}.
                    957: @var{charptr} may be any of three kinds of pointer: @code{char*},
                    958: @code{unsigned char*}, or @code{signed char*}.
                    959: 
                    960: The remaining arguments limit how much to read: up to (but not
                    961: including) the first occurrence in the input of a line delimiter
                    962: character @var{delim}---newline (@code{\n}) by default, or up to
                    963: @samp{len-1} characters (or to end of file, if that happens sooner).
                    964: 
                    965: If @code{getline} succeeds in reading a ``full line'', it also discards
                    966: the trailing delimiter character from the input stream.  (To preserve it
                    967: as available input, see the similar form of @code{iostream::get}.)
                    968: 
                    969: If @var{delim} was @emph{not} found before @var{len} characters or end
                    970: of file, @code{getline} sets the @code{ios::fail} flag, as well as the
                    971: @code{ios::eof} flag if appropriate.
                    972: 
                    973: @code{getline} writes a null character at the end of the string, regardless
                    974: of which condition terminates the read.
                    975: @end deftypefn
                    976: 
                    977: @deftypefn Method istream& istream::read (@var{pointer}, int @var{len})
                    978: Read @var{len} bytes into the location at @var{pointer}, unless the
                    979: input ends first.
                    980: 
                    981: @var{pointer} may be of type @code{char*}, @code{void*}, @code{unsigned
                    982: char*}, or @code{signed char*}.
                    983: 
                    984: If the @code{istream} ends before reading @var{len} bytes, @code{read}
                    985: sets the @code{ios::fail} flag.
                    986: @end deftypefn
                    987: 
                    988: @deftypefn Method istream& istream::gets (char **@var{s} @w{[, char} @var{delim}])
                    989: A @sc{gnu} extension, to read an arbitrarily long string
                    990: from the current input position to the next instance of the @var{delim}
                    991: character (newline @code{\n} by default).
                    992: 
                    993: To permit reading a string of arbitrary length, @code{gets} allocates
                    994: whatever memory is required.  Notice that the first argument @var{s} is
                    995: an address to record a character pointer, rather than the pointer
                    996: itself.
                    997: @end deftypefn
                    998: 
                    999: @deftypefn Method istream& istream::scan (const char *format ...)
                   1000: A @sc{gnu} extension, similar to @code{fscanf(@var{file},
                   1001: @var{format}, ...)}.  The @var{format} is a @code{scanf}-style format
                   1002: control string, which is used to read the variables in the remainder of
                   1003: the argument list from the @code{istream}.
                   1004: @end deftypefn
                   1005: 
                   1006: @deftypefn Method istream& istream::vscan (const char *format, va_list args)
                   1007: Like @code{istream::scan}, but takes a single @code{va_list} argument.
                   1008: @end deftypefn
                   1009: 
                   1010: @node Input Position
                   1011: @subsection Repositioning an @code{istream}
                   1012: 
                   1013: Use these methods to control the current input position:
                   1014: 
                   1015: @deftypefn Method streampos istream::tellg ()
                   1016: Return the current read position, so that you can save it and return to
                   1017: it later with @code{istream::seekg}.
                   1018: @end deftypefn
                   1019: 
                   1020: @deftypefn Method istream& istream::seekg (streampos @var{p})
                   1021: Reset the input pointer (if the input device permits it) to @var{p},
                   1022: usually the result of an earlier call to @code{istream::tellg}.
                   1023: @end deftypefn
                   1024: 
                   1025: @deftypefn Method istream& istream::seekg (streamoff @var{offset}, ios::seek_dir @var{ref})
                   1026: Reset the input pointer (if the input device permits it) to @var{offset}
                   1027: characters from the beginning of the input, the current position, or the
                   1028: end of input.  Specify how to interpret @var{offset} with one of these
                   1029: values for the second argument:
                   1030: 
                   1031: @vtable @code
                   1032: @item ios::beg
                   1033: Interpret @var{loc} as an absolute offset from the beginning of the
                   1034: file.
                   1035: 
                   1036: @item ios::cur
                   1037: Interpret @var{loc} as an offset relative to the current output
                   1038: position.
                   1039: 
                   1040: @item ios::end
                   1041: Interpret @var{loc} as an offset from the current end of the output
                   1042: stream.
                   1043: @end vtable
                   1044: @end deftypefn
                   1045: 
                   1046: @node Istream Housekeeping
                   1047: @subsection Miscellaneous @code{istream} utilities
                   1048: 
                   1049: Use these methods for housekeeping on @code{istream} objects:
                   1050: 
                   1051: @deftypefn Method int istream::gcount ()
                   1052: Report how many characters were read from this @code{istream} in the
                   1053: last unformatted input operation.
                   1054: @c FIXME! Define "unformatted input" somewhere...
                   1055: @end deftypefn
                   1056: 
                   1057: @deftypefn Method int istream::ipfx (int @var{keepwhite})
                   1058: Ensure that the @code{istream} object is ready for reading; check for
                   1059: errors and end of file and flush any tied stream.  @code{ipfx} skips
                   1060: whitespace if you specify @code{0} as the @var{keepwhite}
                   1061: argument, @emph{and} @code{ios::skipws} is set for this stream.
                   1062: 
                   1063: To avoid skipping whitespace (regardless of the @code{skipws} setting on
                   1064: the stream), use @code{1} as the argument.
                   1065: 
                   1066: Call @code{istream::ipfx} to simplify writing your own methods for reading
                   1067: @code{istream} objects.
                   1068: @end deftypefn
                   1069: 
                   1070: @deftypefn Method void istream::isfx ()
                   1071: A placeholder for compliance with the draft @sc{ansi} standard; this
                   1072: method does nothing whatever.
                   1073: 
                   1074: If you wish to write portable standard-conforming code on @code{istream}
                   1075: objects, call @code{isfx} after any operation that reads from an
                   1076: @code{istream}; if @code{istream::ipfx} has any special effects that
                   1077: must be cancelled when done, @code{istream::isfx} will cancel them.
                   1078: @end deftypefn
                   1079: 
                   1080: @deftypefn Method istream& istream::ignore ([int @var{n}] @w{[, int} @var{delim}])
                   1081: Discard some number of characters pending input.  The first optional
                   1082: argument @var{n} specifies how many characters to skip.  The second
                   1083: optional argument @var{delim} specifies a ``boundary'' character:
                   1084: @code{ignore} returns immediately if this character appears in the
                   1085: input.
                   1086: 
                   1087: By default, @var{delim} is @code{EOF}; that is, if you do not specify a
                   1088: second argument, only the count @var{n} restricts how much to ignore
                   1089: (while input is still available).
                   1090: 
                   1091: If you do not specify how many characters to ignore, @code{ignore}
                   1092: returns after discarding only one character.
                   1093: @end deftypefn
                   1094: 
                   1095: @deftypefn Method istream& istream::putback (char @var{ch})
                   1096: Attempts to back up one character, replacing the character backed-up
                   1097: over by @var{ch}.  Returns @code{EOF} if this is not allowed.  Putting
                   1098: back the most recently read character is always allowed.  (This method
                   1099: corresponds to the C function @code{ungetc}.)
                   1100: @end deftypefn
                   1101: 
                   1102: @deftypefn Method istream& istream::unget ()
                   1103: Attempt to back up one character.
                   1104: @end deftypefn
                   1105: 
                   1106: @node Iostream
                   1107: @section Input and output together: class @code{iostream}
                   1108: 
                   1109: If you need to use the same stream for input and output, you can use an
                   1110: object of the class @code{iostream}, which is derived from @emph{both}
                   1111: @code{istream} and @code{ostream}.
                   1112: 
                   1113: The constructors for @code{iostream} behave just like the constructors
                   1114: for @code{istream}.
                   1115: 
                   1116: @deftypefn Constructor {} iostream::iostream ()
                   1117: When used without arguments, the @code{iostream} constructor simply
                   1118: allocates a new @code{ios} object, and initializes the input counter
                   1119: (the value reported by @code{istream::gcount}) to @code{0}.
                   1120: @end deftypefn
                   1121: 
                   1122: @deftypefn Constructor {} iostream::iostream (streambuf* @var{sb} @w{[, ostream*} @var{tie}])
                   1123: You can also call a constructor with one or two arguments.  The first
                   1124: argument @var{sb} is a @code{streambuf*}; if you supply this pointer,
                   1125: the constructor uses that @code{streambuf} for input and output.
                   1126: 
                   1127: You can use the optional second argument @var{tie} (an @code{ostream*})
                   1128: to specify a related output stream as the initial value for
                   1129: @code{ios::tie}.
                   1130: @end deftypefn
                   1131: 
                   1132: @cindex @code{iostream} destructor
                   1133: @cindex destructor for @code{iostream}
                   1134: As for @code{ostream} and @code{istream}, @code{iostream} simply uses
                   1135: the @code{ios} destructor.  However, an @code{iostream} is not deleted by
                   1136: its destructor.
                   1137: 
                   1138: You can use all the @code{istream}, @code{ostream}, and @code{ios}
                   1139: methods with an @code{iostream} object.
                   1140: 
                   1141: @node Files and Strings
                   1142: @chapter Classes for Files and Strings
                   1143: 
                   1144: There are two very common special cases of input and output: using files,
                   1145: and using strings in memory.
                   1146: 
                   1147: @code{libio} defines four specialized classes for these cases:
                   1148: 
                   1149: @ftable @code
                   1150: @item ifstream
                   1151: Methods for reading files.
                   1152: 
                   1153: @item ofstream
                   1154: Methods for writing files.
                   1155: 
                   1156: @item istrstream
                   1157: Methods for reading strings from memory.
                   1158: 
                   1159: @item ostrstream
                   1160: Methods for writing strings in memory.
                   1161: @end ftable
                   1162: 
                   1163: @menu
                   1164: * Files::      Reading and writing files.
                   1165: * Strings::    Reading and writing strings in memory.
                   1166: @end menu
                   1167: 
                   1168: @node Files
                   1169: @section Reading and writing files
                   1170: 
                   1171: These methods are declared in @file{fstream.h}.
                   1172: 
                   1173: @findex ifstream
                   1174: @cindex class @code{ifstream}
                   1175: You can read data from class @code{ifstream} with any operation from class
                   1176: @code{istream}.  There are also a few specialized facilities:
                   1177: 
                   1178: @deftypefn Constructor {} ifstream::ifstream ()
                   1179: Make an @code{ifstream} associated with a new file for input.  (If you
                   1180: use this version of the constructor, you need to call
                   1181: @code{ifstream::open} before actually reading anything)
                   1182: @end deftypefn
                   1183: 
                   1184: @deftypefn Constructor {} ifstream::ifstream (int @var{fd})
                   1185: Make an @code{ifstream} for reading from a file that was already open,
                   1186: using file descriptor @var{fd}.  (This constructor is compatible with
                   1187: other versions of iostreams for @sc{posix} systems, but is not part of
                   1188: the @sc{ansi} working paper.)
                   1189: @end deftypefn
                   1190: 
                   1191: @deftypefn Constructor {} ifstream::ifstream (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]])
                   1192: Open a file @code{*@var{fname}} for this @code{ifstream} object.
                   1193: 
                   1194: By default, the file is opened for input (with @code{ios::in} as
                   1195: @var{mode}).  If you use this constructor, the file will be closed when
                   1196: the @code{ifstream} is destroyed.
                   1197: 
                   1198: You can use the optional argument @var{mode} to specify how to open the
                   1199: file, by combining these enumerated values (with @samp{|} bitwise or).
                   1200: (These values are actually defined in class @code{ios}, so that all
                   1201: file-related streams may inherit them.)  Only some of these modes are
                   1202: defined in the latest draft @sc{ansi} specification; if portability is
                   1203: important, you may wish to avoid the others.
                   1204: 
                   1205: @vtable @code
                   1206: @item ios::in
                   1207: Open for input.  (Included in @sc{ansi} draft.)
                   1208: 
                   1209: @item ios::out
                   1210: Open for output.  (Included in @sc{ansi} draft.)
                   1211: 
                   1212: @item ios::ate
                   1213: Set the initial input (or output) position to the end of the file.
                   1214: 
                   1215: @item ios::app
                   1216: Seek to end of file before each write.  (Included in @sc{ansi} draft.)
                   1217: 
                   1218: @item ios::trunc
                   1219: Guarantee a fresh file; discard any contents that were previously
                   1220: associated with it.
                   1221: 
                   1222: @item ios::nocreate
                   1223: Guarantee an existing file; fail if the specified file did not already
                   1224: exist.
                   1225: 
                   1226: @item ios::noreplace
                   1227: Guarantee a new file; fail if the specified file already existed.
                   1228: 
                   1229: @item ios::bin
                   1230: Open as a binary file (on systems where binary and text files have different
                   1231: properties, typically how @samp{\n} is mapped; included in @sc{ansi} draft).
                   1232: @end vtable
                   1233: 
                   1234: @noindent
                   1235: The last optional argument @var{prot} is specific to Unix-like systems;
                   1236: it specifies the file protection (by default @samp{644}).
                   1237: @end deftypefn
                   1238: 
                   1239: @deftypefn Method void ifstream::open (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]])
                   1240: Open a file explicitly after the associated @code{ifstream} object
                   1241: already exists (for instance, after using the default constructor).  The
                   1242: arguments, options and defaults all have the same meanings as in the
                   1243: fully specified @code{ifstream} constructor.
                   1244: @end deftypefn
                   1245: 
                   1246: @findex ostream
                   1247: @cindex class @code{ostream}
                   1248: You can write data to class @code{ofstream} with any operation from class
                   1249: @code{ostream}.  There are also a few specialized facilities:
                   1250: 
                   1251: @deftypefn Constructor {} ofstream::ofstream ()
                   1252: Make an @code{ofstream} associated with a new file for output.
                   1253: @end deftypefn
                   1254: 
                   1255: @deftypefn Constructor {} ofstream::ofstream (int @var{fd})
                   1256: Make an @code{ofstream} for writing to a file that was already open,
                   1257: using file descriptor @var{fd}.
                   1258: @end deftypefn
                   1259: 
                   1260: @deftypefn Constructor {} ofstream::ofstream (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]])
                   1261: Open a file @code{*@var{fname}} for this @code{ofstream} object.
                   1262: 
                   1263: By default, the file is opened for output (with @code{ios::out} as @var{mode}).
                   1264: You can use the optional argument @var{mode} to specify how to open the
                   1265: file, just as described for @code{ifstream::ifstream}.
                   1266: 
                   1267: The last optional argument @var{prot} specifies the file protection (by
                   1268: default @samp{644}).
                   1269: @end deftypefn
                   1270: 
                   1271: @deftypefn Destructor {} ofstream::~ofstream ()
                   1272: The files associated with @code{ofstream} objects are closed when the
                   1273: corresponding object is destroyed.
                   1274: @end deftypefn
                   1275: 
                   1276: @deftypefn Method void ofstream::open (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]])
                   1277: Open a file explicitly after the associated @code{ofstream} object
                   1278: already exists (for instance, after using the default constructor).  The
                   1279: arguments, options and defaults all have the same meanings as in the
                   1280: fully specified @code{ofstream} constructor.
                   1281: @end deftypefn
                   1282: 
                   1283: @findex fstream
                   1284: @cindex class @code{fstream}
                   1285: The class @code{fstream} combines the facilities of @code{ifstream} and
                   1286: @code{ofstream}, just as @code{iostream} combines @code{istream} and
                   1287: @code{ostream}.
                   1288: 
                   1289: @c FIXME-future: say something about fstream constructor, maybe.
                   1290: 
                   1291: @findex fstreambase
                   1292: @cindex class @code{fstreambase}
                   1293: The class @code{fstreambase} underlies both @code{ifstream} and
                   1294: @code{ofstream}.  They both inherit this additional method:
                   1295: 
                   1296: @deftypefn Method void fstreambase::close ()
                   1297: Close the file associated with this object, and set @code{ios::fail} in
                   1298: this object to mark the event.
                   1299: @end deftypefn
                   1300: 
                   1301: @node Strings
                   1302: @section Reading and writing in memory
                   1303: 
                   1304: @c FIXME!! Per, there's a lot of guesswork here---please check carefully!
                   1305: 
                   1306: @findex istrstream
                   1307: @cindex class @code{istrstream}
                   1308: @findex ostrstream
                   1309: @cindex class @code{ostrstream}
                   1310: @findex strstream
                   1311: @cindex class @code{strstream}
                   1312: @findex strstreambase
                   1313: @cindex class @code{strstreambase}
                   1314: @findex strstreambuf
                   1315: @cindex class @code{strstreambuf}
                   1316: The classes @code{istrstream}, @code{ostrstream}, and @code{strstream}
                   1317: provide some additional features for reading and writing strings in
                   1318: memory---both static strings, and dynamically allocated strings.  The
                   1319: underlying class @code{strstreambase} provides some features common to
                   1320: all three; @code{strstreambuf} underlies that in turn.
                   1321: 
                   1322: @c FIXME-future:  Document strstreambuf methods one day, when we document
                   1323: @c streambuf more fully.
                   1324: 
                   1325: @deftypefn Constructor {} istrstream::istrstream (const char* @var{str} @w{[, int} @var{size}])
                   1326: Associate the new input string class @code{istrstream} with an existing
                   1327: static string starting at @var{str}, of size @var{size}.  If you do not
                   1328: specify @var{size}, the string is treated as a @code{NUL} terminated string.
                   1329: @end deftypefn
                   1330: 
                   1331: @deftypefn Constructor {} ostrstream::ostrstream ()
                   1332: Create a new stream for output to a dynamically managed string, which
                   1333: will grow as needed.
                   1334: @end deftypefn
                   1335: 
                   1336: @deftypefn Constructor {} ostrstream::ostrstream (char* @var{str}, int @var{size} [,int @var{mode}])
                   1337: A new stream for output to a statically defined string of length
                   1338: @var{size}, starting at @var{str}.  You may optionally specify one of
                   1339: the modes described for @code{ifstream::ifstream}; if you do not specify
                   1340: one, the new stream is simply open for output, with mode @code{ios::out}.
                   1341: @end deftypefn
                   1342: 
                   1343: @deftypefn Method int ostrstream::pcount ()
                   1344: Report the current length of the string associated with this @code{ostrstream}.
                   1345: @end deftypefn
                   1346: 
                   1347: @deftypefn Method char* ostrstream::str ()
                   1348: A pointer to the string managed by this @code{ostrstream}.  Implies
                   1349: @samp{ostrstream::freeze()}.
                   1350: @end deftypefn
                   1351: 
                   1352: @deftypefn Method void ostrstream::freeze ([int @var{n}])
                   1353: If @var{n} is nonzero (the default), declare that the string associated
                   1354: with this @code{ostrstream} is not to change dynamically; while frozen,
                   1355: it will not be reallocated if it needs more space, and it will not be
                   1356: deallocated when the @code{ostrstream} is destroyed.  Use
                   1357: @samp{freeze(1)} if you refer to the string as a pointer after creating
                   1358: it via @code{ostrstream} facilities.
                   1359: 
                   1360: @samp{freeze(0)} cancels this declaration, allowing a dynamically
                   1361: allocated string to be freed when its @code{ostrstream} is destroyed.
                   1362: 
                   1363: If this @code{ostrstream} is already static---that is, if it was created
                   1364: to manage an existing statically allocated string---@code{freeze} is
                   1365: unnecessary, and has no effect.
                   1366: @end deftypefn
                   1367: 
                   1368: @deftypefn Method int ostrstream::frozen ()
                   1369: Test whether @code{freeze(1)} is in effect for this string.
                   1370: @end deftypefn
                   1371: 
                   1372: @deftypefn Method strstreambuf* strstreambase::rdbuf ()
                   1373: A pointer to the underlying @code{strstreambuf}.
                   1374: @end deftypefn
                   1375: 
                   1376: @node Streambuf
                   1377: @chapter Using the @code{streambuf} Layer
                   1378: 
                   1379: The @code{istream} and @code{ostream} classes are meant to handle
                   1380: conversion between objects in your program and their textual representation.
                   1381: 
                   1382: By contrast, the underlying @code{streambuf} class is for transferring
                   1383: raw bytes between your program, and input sources or output sinks.
                   1384: Different @code{streambuf} subclasses connect to different kinds of
                   1385: sources and sinks.
                   1386: 
                   1387: The @sc{gnu} implementation of @code{streambuf} is still evolving; we
                   1388: describe only some of the highlights.
                   1389: 
                   1390: @menu
                   1391: * Areas::              Areas in a streambuf.
                   1392: * Formatting::         C-style formatting for streambuf objects.
                   1393: * Stdiobuf::           Wrappers for C stdio.
                   1394: * Backing Up::         Marking and returning to a position.
                   1395: * Indirectbuf::                Forwarding I/O activity.
                   1396: @end menu
                   1397: 
                   1398: @node Areas
                   1399: @section Areas of a @code{streambuf}
                   1400: 
                   1401: Streambuf buffer management is fairly sophisticated (this is a
                   1402: nice way to say ``complicated'').  The standard protocol
                   1403: has the following ``areas'':
                   1404: 
                   1405: @itemize @bullet
                   1406: @item
                   1407: @cindex put area
                   1408: The @dfn{put area} contains characters waiting for output.
                   1409: 
                   1410: @item
                   1411: @cindex get area
                   1412: The @dfn{get area} contains characters available for reading.
                   1413: @end itemize
                   1414: 
                   1415: The @sc{gnu} @code{streambuf} design extends this, but the details are
                   1416: still evolving.
                   1417: 
                   1418: @node Formatting
                   1419: @section C-style formatting for @code{streambuf} objects
                   1420: 
                   1421: The @sc{gnu} @code{streambuf} class supports @code{printf}-like
                   1422: formatting and scanning.
                   1423: 
                   1424: @deftypefn Method int streambuf::vform (const char *@var{format}, ...)
                   1425: Similar to @code{fprintf(@var{file}, @var{format}, ...)}.
                   1426: The @var{format} is a @code{printf}-style format control string, which is used
                   1427: to format the (variable number of) arguments, printing the result on
                   1428: the @code{this} streambuf.  The result is the number of characters printed.
                   1429: @end deftypefn
                   1430: 
                   1431: @deftypefn Method int streambuf::vform (const char *@var{format}, va_list @var{args})
                   1432: Similar to @code{vfprintf(@var{file}, @var{format}, @var{args})}.
                   1433: The @var{format} is a @code{printf}-style format control string, which is used
                   1434: to format the argument list @var{args}, printing the result on
                   1435: the @code{this} streambuf.  The result is the number of characters printed.
                   1436: @end deftypefn
                   1437: 
                   1438: @deftypefn Method int streambuf::scan (const char *@var{format}, ...)
                   1439: Similar to @code{fscanf(@var{file}, @var{format}, ...)}.
                   1440: The @var{format} is a @code{scanf}-style format control string, which is used
                   1441: to read the (variable number of) arguments from the @code{this} streambuf.
                   1442: The result is the number of items assigned, or @code{EOF} in case of
                   1443: input failure before any conversion.
                   1444: @end deftypefn
                   1445: 
                   1446: @deftypefn Method int streambuf::vscan (const char *@var{format}, va_list @var{args})
                   1447: Like @code{streambuf::scan}, but takes a single @code{va_list} argument.
                   1448: @end deftypefn
                   1449: 
                   1450: @node Stdiobuf
                   1451: @section Wrappers for C @code{stdio}
                   1452: 
                   1453: A @dfn{stdiobuf} is a @code{streambuf} object that points to
                   1454: a @code{FILE} object (as defined by @code{stdio.h}).
                   1455: All @code{streambuf} operations on the @code{stdiobuf} are forwarded
                   1456: to the @code{FILE}.  Thus the @code{stdiobuf} object provides a
                   1457: wrapper around a @code{FILE}, allowing use of @code{streambuf}
                   1458: operations on a @code{FILE}.  This can be useful when mixing
                   1459: C code with C++ code.
                   1460: 
                   1461: The pre-defined streams @code{cin}, @code{cout}, and @code{cerr} are
                   1462: normally implemented as @code{stdiobuf} objects that point to
                   1463: respectively @code{stdin}, @code{stdout}, and @code{stderr}.  This is
                   1464: convenient, but it does cost some extra overhead.
                   1465: 
                   1466: If you set things up to use the implementation of @code{stdio} provided
                   1467: with this library, then @code{cin}, @code{cout}, and @code{cerr} will be
                   1468: set up to to use @code{stdiobuf} objects, since you get their benefits
                   1469: for free.  @xref{Stdio,,C Input and Output}.
                   1470: 
                   1471: @ignore
                   1472: @c FIXME-future: setbuf is not yet documented, hence this para is not useful.
                   1473: Note that if you use @code{setbuf} to give a buffer to a @code{stdiobuf},
                   1474: that buffer will provide intermediate buffering in addition that
                   1475: whatever is done by the @code{FILE}.
                   1476: @end ignore
                   1477: 
                   1478: @node Backing Up
                   1479: @section Backing up
                   1480: 
                   1481: The @sc{gnu} iostream library allows you to ask a @code{streambuf} to
                   1482: remember the current position.  This allows you to go back to this
                   1483: position later, after reading further.  You can back up arbitrary
                   1484: amounts, even on unbuffered files or multiple buffers' worth, as long as
                   1485: you tell the library in advance.  This unbounded backup is very useful
                   1486: for scanning and parsing applications.  This example shows a typical
                   1487: scenario:
                   1488: 
                   1489: @cartouche
                   1490: @smallexample
                   1491: // Read either "dog", "hound", or "hounddog".
                   1492: // If "dog" is found, return 1.
                   1493: // If "hound" is found, return 2.
                   1494: // If "hounddog" is found, return 3.
                   1495: // If none of these are found, return -1.
                   1496: int my_scan(streambuf* sb)
                   1497: @{
                   1498:     streammarker fence(sb);
                   1499:     char buffer[20];
                   1500:     // Try reading "hounddog":
                   1501:     if (sb->sgetn(buffer, 8) == 8
                   1502:         && strncmp(buffer, "hounddog", 8) == 0)
                   1503:       return 3;
                   1504:     // No, no "hounddog":  Back up to 'fence'
                   1505:     sb->seekmark(fence); // 
                   1506:     // ... and try reading "dog":
                   1507:     if (sb->sgetn(buffer, 3) == 3
                   1508:         && strncmp(buffer, "dog", 3) == 0)
                   1509:       return 1;
                   1510:     // No, no "dog" either:  Back up to 'fence'
                   1511:     sb->seekmark(fence); // 
                   1512:     // ... and try reading "hound":
                   1513:     if (sb->sgetn(buffer, 5) == 5
                   1514:         && strncmp(buffer, "hound", 5) == 0)
                   1515:       return 2;
                   1516:     // No, no "hound" either:  Back up and signal failure.
                   1517:     sb->seekmark(fence); // Backup to 'fence'
                   1518:     return -1;
                   1519: @}
                   1520: @end smallexample
                   1521: @end cartouche
                   1522: 
                   1523: @deftypefn Constructor {} streammarker::streammarker (streambuf* @var{sbuf})
                   1524: Create a @code{streammarker} associated with @var{sbuf}
                   1525: that remembers the current position of the get pointer.
                   1526: @end deftypefn
                   1527: 
                   1528: @deftypefn Method int streammarker::delta (streammarker& @var{mark2})
                   1529: Return the difference between the get positions corresponding
                   1530: to @code{*this} and @var{mark2} (which must point into the same
                   1531: @code{streambuffer} as @code{this}).
                   1532: @end deftypefn
                   1533: 
                   1534: @deftypefn Method int streammarker::delta ()
                   1535: Return the position relative to the streambuffer's current get position.
                   1536: @end deftypefn
                   1537: 
                   1538: @deftypefn Method int streambuffer::seekmark (streammarker& @var{mark})
                   1539: Move the get pointer to where it (logically) was when @var{mark}
                   1540: was constructed.
                   1541: @end deftypefn
                   1542: 
                   1543: @node Indirectbuf
                   1544: @section Forwarding I/O activity
                   1545: 
                   1546: An @dfn{indirectbuf} is one that forwards all of its I/O requests
                   1547: to another streambuf.
                   1548: 
                   1549: @ignore
                   1550: @c FIXME-future: get_stream and put_stream are so far undocumented.
                   1551: All get-related requests are sent to get_stream().
                   1552: All put-related requests are sent to put_stream().
                   1553: @end ignore
                   1554: 
                   1555: An @code{indirectbuf} can be used to implement Common Lisp
                   1556: synonym-streams and two-way-streams:
                   1557: 
                   1558: @example
                   1559: class synonymbuf : public indirectbuf @{
                   1560:    Symbol *sym;
                   1561:    synonymbuf(Symbol *s) @{ sym = s; @}
                   1562:    virtual streambuf *lookup_stream(int mode) @{
                   1563:        return coerce_to_streambuf(lookup_value(sym)); @}
                   1564: @};
                   1565: @end example
                   1566: 
                   1567: @node Stdio
                   1568: @chapter C Input and Output
                   1569: 
                   1570: @code{libio} is distributed with a complete implementation of the ANSI C
                   1571: @code{stdio} facility.  It is implemented using @code{streambuf}
                   1572: objects.  @xref{Stdiobuf,,Wrappers for C @code{stdio}}.
                   1573: 
                   1574: The @code{stdio} package is intended as a replacement for the whatever
                   1575: @code{stdio} is in your C library.
                   1576: @ignore
                   1577: @c FIXME-future:  This is not useful unless we specify what problems.
                   1578: It can co-exist with C libraries that have alternate implementations of
                   1579: stdio, but there may be some problems.
                   1580: @end ignore
                   1581: Since @code{stdio} works best when you build @code{libc} to contain it, and
                   1582: that may be inconvenient, it is not installed by default.
                   1583: 
                   1584: Extensions beyond @sc{ansi}:
                   1585: 
                   1586: @itemize @bullet
                   1587: @item
                   1588: A stdio @code{FILE} is identical to a streambuf.
                   1589: Hence there is no need to worry about synchronizing C and C++
                   1590: input/output---they are by definition always synchronized.
                   1591: 
                   1592: @item
                   1593: If you create a new streambuf sub-class (in C++), you can use it as a
                   1594: @code{FILE} from C.  Thus the system is extensible using the standard
                   1595: @code{streambuf} protocol.
                   1596: 
                   1597: @item
                   1598: You can arbitrarily mix reading and writing, without having to seek
                   1599: in between.
                   1600: 
                   1601: @item
                   1602: Unbounded @code{ungetc()} buffer.
                   1603: @end itemize
                   1604: 
                   1605: @ignore
                   1606: @c FIXME-future: Per says this is not ready to go public at v0.5
                   1607: @node Libio buffer management
                   1608: @chapter Libio buffer management
                   1609: 
                   1610: The libio user functions present an abstract sequence of characters,
                   1611: that they read and write from.  A number of buffers are used to go
                   1612: between the user program and the abstract sequence.  These buffers are
                   1613: concrete arrays of characters that contain some sub-sequence of the
                   1614: abstract sequence.
                   1615: 
                   1616: The libio buffer management protocol is fairly complex.  Its design is
                   1617: based on the C++ @code{streambuf} protocol, so that the C++
                   1618: @code{streambuf} classes can be trivially implemented on top of the
                   1619: libio protocol.
                   1620: 
                   1621: The @dfn{write area} contains characters waiting for output.
                   1622: 
                   1623: The @dfn{read area} contains characters available for reading.
                   1624: 
                   1625: The @dfn{reserve area} is available to virtual methods.
                   1626: Usually, the get and/or put areas are part of the reserve area.
                   1627: 
                   1628: The @dfn{main get area} contains characters that have
                   1629: been read in from the character source, but not yet
                   1630: read by the application.
                   1631: 
                   1632: The @dfn{backup area} contains previously read data that is being saved
                   1633: because of a user request, or that have been "unread" (put back).
                   1634: @end ignore
                   1635: 
                   1636: @ignore
                   1637: @c Per says this design is not finished
                   1638: @node Streambuf internals
                   1639: @chapter Streambuf internals
                   1640: 
                   1641: @menu
                   1642: * Buffer management::
                   1643: * Filebuf internals::
                   1644: @end menu
                   1645: 
                   1646: @node Buffer management
                   1647: @section Buffer management
                   1648: 
                   1649: @subsection Areas
                   1650: 
                   1651: NOTE:  This chapter is due for an update.
                   1652: 
                   1653: Streambuf buffer management is fairly sophisticated (this is a
                   1654: nice way to say "complicated").  The standard protocol
                   1655: has the following "areas":
                   1656: 
                   1657: @itemize @bullet
                   1658: @cindex put area
                   1659: @item
                   1660: The @dfn{put area} contains characters waiting for output.
                   1661: @cindex get area
                   1662: @item
                   1663: The @dfn{get area} contains characters available for reading.
                   1664: @cindex reserve area
                   1665: @item
                   1666: The @dfn{reserve area} is available to virtual methods.
                   1667: Usually, the get and/or put areas are part of the reserve area.
                   1668: @end itemize
                   1669: 
                   1670: The @sc{gnu} @code{streambuf} design extends this by supporting two
                   1671: get areas:
                   1672: @itemize @bullet
                   1673: @cindex main get area
                   1674: @item
                   1675: The @dfn{main get area} contains characters that have
                   1676: been read in from the character source, but not yet
                   1677: read by the application.
                   1678: @cindex backup area
                   1679: @item
                   1680: The @dfn{backup area} contains previously read data that is being
                   1681: saved because of a user request, or that have been "unread" (putback).
                   1682: @end itemize
                   1683: 
                   1684: The backup and the main get area are logically contiguous:  That is,
                   1685: the first character of the main get area follows the last character
                   1686: of the backup area.
                   1687: 
                   1688: The @dfn{current get area} is whichever one of the backup or
                   1689: main get areas that is currently being read from.
                   1690: The other of the two is the @dfn{non-current get area}.
                   1691: 
                   1692: @subsection Pointers
                   1693: 
                   1694: The following @code{char*} pointers define the various areas.
                   1695: (Note that if a pointer points to the 'end' of an area,
                   1696: it means that it points to the character after the area.)
                   1697: 
                   1698: @deftypefn Method char* streambuffer::base ()
                   1699: The start of the reserve area.
                   1700: @end deftypefn
                   1701: 
                   1702: @deftypefn Method char* streambuffer::ebuf ()
                   1703: The end of the reserve area.
                   1704: @end deftypefn
                   1705: 
                   1706: @deftypefn Method char* streambuffer::pbase ()
                   1707: The start of the put area.
                   1708: @end deftypefn
                   1709: 
                   1710: @deftypefn Method char* streambuffer::pptr ()
                   1711: The current put position.
                   1712: If @code{pptr() < epptr()}, then the next write will
                   1713: overwrite @code{*pptr()}, and increment @code{pptr()}.
                   1714: @end deftypefn
                   1715: 
                   1716: @deftypefn Method char* streambuffer::epptr ()
                   1717: The end of the put area.
                   1718: @end deftypefn
                   1719: 
                   1720: @deftypefn Method char* streambuffer::eback ()
                   1721: The start of the current get area.
                   1722: @end deftypefn
                   1723: 
                   1724: @deftypefn Method char* streambuffer::gptr ()
                   1725: The current get position.
                   1726: If @code{gptr() < egptr()}, then the next read will
                   1727: read @code{*gptr()}, and increment @code{gptr()}.
                   1728: @end deftypefn
                   1729: 
                   1730: @deftypefn Method char* streambuffer::egptr ()
                   1731: The end of the current get area.
                   1732: @end deftypefn
                   1733: 
                   1734: @deftypefn Method char* streambuffer::Gbase ()
                   1735: The start of the main get area.
                   1736: @end deftypefn
                   1737: 
                   1738: @deftypefn Method char* streambuffer::eGptr ()
                   1739: The end of the main get area.
                   1740: @end deftypefn
                   1741: 
                   1742: @deftypefn Method char* streambuffer::Bbase ()
                   1743: The start of the backup area.
                   1744: @end deftypefn
                   1745: 
                   1746: @deftypefn Method char* streambuffer::Bptr ()
                   1747: The start of the used part of the backup area.
                   1748: The area (@code{Bptr()} .. @code{eBptr()}) contains data that has been
                   1749: pushed back, while (@code{Bbase()} .. @code{eBptr()}) contains unused
                   1750: space available for future putbacks.
                   1751: @end deftypefn
                   1752: 
                   1753: @deftypefn Method char* streambuffer::eBptr ()
                   1754: The end of the backup area.
                   1755: @end deftypefn
                   1756: 
                   1757: @deftypefn Method char* streambuffer::Nbase ()
                   1758: The start of the non-current get area (either @code{main_gbase} or @code{backup_gbase}).
                   1759: @end deftypefn
                   1760: 
                   1761: @deftypefn Method char* streambuffer::eNptr ()
                   1762: The end of the non-current get area.
                   1763: @end deftypefn
                   1764: 
                   1765: @node Filebuf internals
                   1766: @section Filebuf internals
                   1767: 
                   1768: The @code{filebuf} is used a lot, so it is importamt that it be
                   1769: efficient.  It is also supports rather complex semantics.
                   1770: so let us examine its implementation.
                   1771: 
                   1772: @subsection Tied read and write pointers
                   1773: 
                   1774: The streambuf model allows completely independent read and write pointers.
                   1775: However, a @code{filebuf} has only a single logical pointer used
                   1776: for both reads and writes.  Since the @code{streambuf} protocol
                   1777: uses @code{gptr()} for reading and @code{pptr()} for writing,
                   1778: we map the logical file pointer into either @code{gptr()} or @code{pptr()}
                   1779: at different times.
                   1780: 
                   1781: @itemize @bullet
                   1782: @item
                   1783: Reading is allowed when @code{gptr() < egptr()}, which we call get mode.
                   1784: 
                   1785: @item
                   1786: Writing is allowed when @code{pptr() < epptr()}, which we call put mode.
                   1787: @end itemize
                   1788: 
                   1789: @noindent
                   1790: A @code{filebuf} cannot be in get mode and put mode at the same time.
                   1791: 
                   1792: We have up to two buffers:
                   1793: 
                   1794: @itemize @bullet
                   1795: @item
                   1796: The backup area, defined by @code{Bbase()}, @code{Bptr()}, and @code{eBptr()}.
                   1797: This can be empty.
                   1798: 
                   1799: @item
                   1800: The reserve area, which also contains the main get area.
                   1801: For an unbuffered file, the (@code{shortbuf()}..@code{shortbuf()+1}) is used,
                   1802: where @code{shortbuf()} points to a 1-byte buffer that is part of
                   1803: the @code{filebuf}.
                   1804: @end itemize
                   1805: 
                   1806: @noindent
                   1807: The file system's idea of the current position is @code{eGptr()}.
                   1808: 
                   1809: Characters that have been written into a buffer but not yet written
                   1810: out (flushed) to the file systems are those between @code{pbase()}
                   1811: and @code{pptr()}.
                   1812: 
                   1813: The end of the valid data bytes is:
                   1814: @code{pptr() > eGptr() && pptr() < ebuf() ? pptr() : eGptr()}.
                   1815: 
                   1816: If the @code{filebuf} is unbuffered or line buffered,
                   1817: the @code{eptr()} is @code{pbase()}.  This forces a call
                   1818: to @code{overflow()} on each put of a character.
                   1819: The logical @code{epptr()} is @code{epptr() ? ebuf() : NULL}.
                   1820: (If the buffer is read-only, set @code{pbase()}, @code{pptr()},
                   1821: and @code{epptr()} to @code{NULL}. NOT!)
                   1822: @end ignore
                   1823: 
                   1824: @node Index
                   1825: @unnumbered Index
                   1826: @printindex cp
                   1827: 
                   1828: @contents
                   1829: @bye

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.