diff options
Diffstat (limited to 'contrib/libg++/libio/iostream.texi')
-rw-r--r-- | contrib/libg++/libio/iostream.texi | 1971 |
1 files changed, 0 insertions, 1971 deletions
diff --git a/contrib/libg++/libio/iostream.texi b/contrib/libg++/libio/iostream.texi deleted file mode 100644 index 6a93567f087d..000000000000 --- a/contrib/libg++/libio/iostream.texi +++ /dev/null @@ -1,1971 +0,0 @@ -\input texinfo @c -*-Texinfo-*- -@c Copyright (c) 1993 Free Software Foundation, Inc. - -@c %**start of header -@setfilename iostream.info -@settitle The GNU C++ Iostream Library -@setchapternewpage odd -@c %**end of header - -@ifinfo -@format -START-INFO-DIR-ENTRY -* iostream: (iostream). The C++ input/output facility. -END-INFO-DIR-ENTRY -@end format - -This file describes libio, the GNU library for C++ iostreams and C stdio. - -libio includes software developed by the University of California, -Berkeley. - -Copyright (C) 1993 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end ifinfo - -@finalout -@syncodeindex fn cp -@syncodeindex vr cp - -@titlepage -@title The GNU C++ Iostream Library -@subtitle Reference Manual for @code{libio} Version 0.64 -@sp 3 -@author Per Bothner @hfill @code{bothner@@cygnus.com} -@author Cygnus Support @hfill @code{doc@@cygnus.com} -@page - -@vskip 0pt plus 1filll -Copyright @copyright{} 1993 Free Software Foundation, Inc. - -@code{libio} includes software developed by the University of -California, Berkeley. - -@code{libio} uses floating-point software written by David M. Gay, which -includes the following notice: - -@quotation -The author of this software is David M. Gay. - -Copyright (c) 1991 by AT&T. - -Permission to use, copy, modify, and distribute this software for any -purpose without fee is hereby granted, provided that this entire notice -is included in all copies of any software which is or includes a copy -or modification of this software and in all copies of the supporting -documentation for such software. - -THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED -WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR AT&T MAKES ANY -REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY -OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. -@end quotation - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided also that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions. -@end titlepage - -@ifinfo -@node Top -@top The GNU C++ Iostream Library - -This file provides reference information on the GNU C++ iostream library -(@code{libio}), version 0.64. - -@menu -* Introduction:: -* Operators:: Operators and default streams. -* Streams:: Stream classes. -* Files and Strings:: Classes for files and strings. -* Streambuf:: Using the streambuf layer. -* Stdio:: C input and output. -* Index:: -@end menu -@end ifinfo - -@node Introduction -@chapter Introduction - -The iostream classes implement most of the features of AT&T version 2.0 -iostream library classes, and most of the features of the ANSI X3J16 -library draft (which is based on the AT&T design). - -This manual is meant as a reference; for tutorial material on iostreams, -see the corresponding section of any recent popular introduction to C++. - -@menu -* Copying:: Special GNU licensing terms for libio. -* Acknowledgements:: Contributors to GNU iostream. -@end menu - -@node Copying -@section Licensing terms for @code{libio} - -Since the @code{iostream} classes are so fundamental to standard C++, -the Free Software Foundation has agreed to a special exception to its -standard license, when you link programs with @code{libio.a}: - -@quotation -As a special exception, if you link this library with files -compiled with a GNU compiler to produce an executable, this does not cause -the resulting executable to be covered by the GNU General Public License. -This exception does not however invalidate any other reasons why -the executable file might be covered by the GNU General Public License. -@end quotation - -The code is under the @sc{gnu} General Public License (version 2) for -all other purposes than linking with this library; that means that you -can modify and redistribute the code as usual, but remember that if you -do, your modifications, and anything you link with the modified code, -must be available to others on the same terms. - -These functions are also available as part of the @code{libg++} -library; if you link with that library instead of @code{libio}, the -@sc{gnu} Library General Public License applies. - -@node Acknowledgements -@section Acknowledgements - -Per Bothner wrote most of the @code{iostream} library, but some portions -have their origins elsewhere in the free software community. Heinz -Seidl wrote the IO manipulators. The floating-point conversion software -is by David M. Gay of AT&T. Some code was derived from parts of BSD -4.4, which was written at the University of California, Berkeley. - -The iostream classes are found in the @code{libio} library. An early -version was originally distributed in @code{libg++}, and they are still -included there as well, for convenience if you need other @code{libg++} -classes. Doug Lea was the original author of @code{libg++}, and some of -the file-management code still in @code{libio} is his. - -Various people found bugs or offered suggestions. Hongjiu Lu worked -hard to use the library as the default stdio implementation for Linux, -and has provided much stress-testing of the library. - -@node Operators -@chapter Operators and Default Streams - -The @sc{gnu} iostream library, @file{libio}, implements the standard -input and output facilities for C++. These facilities are roughly -analogous (in their purpose and ubiquity, at least) with those defined -by the C @file{stdio} functions. - -Although these definitions come from a library, rather than being part -of the ``core language'', they are sufficiently central to be specified -in the latest working papers for C++. - -You can use two operators defined in this library for basic input and -output operations. They are familiar from any C++ introductory -textbook: @code{<<} for output, and @code{>>} for input. (Think of data -flowing in the direction of the ``arrows''.) - -These operators are often used in conjunction with three streams that -are open by default: - -@deftypevar ostream cout -The standard output stream, analogous to the C @code{stdout}. -@end deftypevar - -@deftypevar istream cin -The standard input stream, analogous to the C @code{stdin}. -@end deftypevar - -@deftypevar ostream cerr -An alternative output stream for errors, analogous to the C -@code{stderr}. -@end deftypevar - -@noindent -For example, this bare-bones C++ version of the traditional ``hello'' -program uses @code{<<} and @code{cout}: - -@example -#include <iostream.h> - -int main(int argc, char **argv) -@{ - cout << "Well, hi there.\n"; - return 0; -@} -@end example - -Casual use of these operators may be seductive, but---other than in -writing throwaway code for your own use---it is not necessarily simpler -than managing input and output in any other language. For example, -robust code should check the state of the input and output streams -between operations (for example, using the method @code{good}). -@xref{States,,Checking the state of a stream}. You may also need to -adjust maximum input or output field widths, using manipulators like -@code{setw} or @code{setprecision}. - -@defop Operator ostream << -Write output to an open output stream of class @code{ostream}. -Defined by this library on any @var{object} of a C++ primitive type, and -on other classes of the library. You can overload the definition for any -of your own applications' classes. - -Returns a reference to the implied argument @code{*this} (the open stream it -writes on), permitting statements like -@example -cout << "The value of i is " << i << "\n"; -@end example -@end defop - -@defop Operator istream >> -Read input from an open input stream of class @code{istream}. Defined -by this library on primitive numeric, pointer, and string types; you can -extend the definition for any of your own applications' classes. - -Returns a reference to the implied argument @code{*this} (the open stream -it reads), permitting multiple inputs in one statement. -@end defop - -@node Streams -@chapter Stream Classes - -The previous chapter referred in passing to the classes @code{ostream} -and @code{istream}, for output and input respectively. These classes -share certain properties, captured in their base class @code{ios}. - -@menu -* Ios:: Shared properties. -* Ostream:: Managing output streams. -* Istream:: Managing input streams. -* Iostream:: Input and output together. -@end menu - -@node Ios -@section Shared properties: class @code{ios} - -The base class @code{ios} provides methods to test and manage the state -of input or output streams. - -@code{ios} delegates the job of actually reading and writing bytes to -the abstract class @code{streambuf}, which is designed to provide -buffered streams (compatible with C, in the @sc{gnu} implementation). -@xref{Streambuf,,Using the @code{streambuf} layer}, for information on -the facilities available at the @code{streambuf} level. - -@deftypefn Constructor {} ios::ios ([streambuf* @var{sb} @w{[, ostream*} @var{tie}]) -The @code{ios} constructor by default initializes a new @code{ios}, and -if you supply a @code{streambuf} @var{sb} to associate with it, sets the -state @code{good} in the new @code{ios} object. It also sets the -default properties of the new object. - -@ignore -@c FIXME--future: this (a) doesn't work, (b) is controversial at ANSI -An @code{ios} without a @code{streambuf} has the state @code{bad} until -you supply a @code{streambuf}; you can do that by assigning a new value -to the @code{ios} with @samp{=}. -@end ignore - -You can also supply an optional second argument @var{tie} to the -constructor: if present, it is an initial value for @code{ios::tie}, to -associate the new @code{ios} object with another stream. -@end deftypefn - -@deftypefn Destructor {} ios::~ios () -The @code{ios} destructor is virtual, permitting application-specific -behavior when a stream is closed---typically, the destructor frees any -storage associated with the stream and releases any other associated -objects. -@end deftypefn - -@c FIXME-future: Is @deftypefn really the best way of displaying these? - -@c FIXME-future: Undocumented: ios::_throw_failure, ios::exceptions; things -@c controlled by _STREAM_COMPAT; ios::Init; ios::_IO_fix_vtable. - -@menu -* States:: Checking the state of a stream. -* Format Control:: Choices in formatting. -* Manipulators:: Convenient ways of changing stream properties. -* Extending:: Extended data fields. -* Synchronization:: Synchronizing related streams. -* Streambuf from Ios:: Reaching the underlying streambuf. -@end menu - -@node States -@subsection Checking the state of a stream - -Use this collection of methods to test for (or signal) errors and other -exceptional conditions of streams: - -@deftypefn Method {ios::operator void*} () const -You can do a quick check on the state of the most recent operation on a -stream by examining a pointer to the stream itself. The pointer is -arbitrary except for its truth value; it is true if no failures have -occurred (@code{ios::fail} is not true). For example, you might ask for -input on @code{cin} only if all prior output operations succeeded: - -@example -if (cout) -@{ - // Everything OK so far - cin >> new_value; - @dots{} -@} -@end example -@end deftypefn - -@deftypefn Method {ios::operator !} () const -In case it is more convenient to check whether something has failed, the -operator @code{!} returns true if @code{ios::fail} is true (an operation -has failed). For example, -you might issue an error message if input failed: - -@example -if (!cin) -@{ - // Oops - cerr << "Eh?\n"; -@} -@end example -@end deftypefn - -@deftypefn Method iostate ios::rdstate () const -Return the state flags for this stream. The value is from the -enumeration @code{iostate}. You can test for any combination of - -@vtable @code -@item goodbit -There are no indications of exceptional states on this stream. - -@item eofbit -End of file. - -@item failbit -An operation has failed on this stream; this usually indicates bad -format of input. - -@item badbit -The stream is unusable. -@end vtable -@end deftypefn - -@deftypefn Method void ios::setstate (iostate @var{state}) -@findex ios::set -Set the state flag for this stream to @var{state} @emph{in addition to} -any state flags already set. Synonym (for upward compatibility): -@code{ios::set}. - -See @code{ios::clear} to set the stream state without regard to existing -state flags. See @code{ios::good}, @code{ios::eof}, @code{ios::fail}, -and @code{ios::bad}, to test the state. -@end deftypefn - -@deftypefn Method int ios::good () const -Test the state flags associated with this stream; true if no error -indicators are set. -@end deftypefn - -@deftypefn Method int ios::bad () const -Test whether a stream is marked as unusable. (Whether -@code{ios::badbit} is set.) -@end deftypefn - -@deftypefn Method int ios::eof () const -True if end of file was reached on this stream. (If @code{ios::eofbit} -is set.) -@end deftypefn - -@deftypefn Method int ios::fail () const -Test for any kind of failure on this stream: @emph{either} some -operation failed, @emph{or} the stream is marked as bad. (If either -@code{ios::failbit} or @code{ios::badbit} is set.) -@end deftypefn - -@deftypefn Method void ios::clear (iostate @var{state}) -@c FIXME-future: There is some complication to do with buffering and _throw_failure -Set the state indication for this stream to the argument @var{state}. -You may call @code{ios::clear} with no argument, in which case the state -is set to @code{good} (no errors pending). - -See @code{ios::good}, @code{ios::eof}, @code{ios::fail}, and -@code{ios::bad}, to test the state; see @code{ios::set} or -@code{ios::setstate} for an alternative way of setting the state. -@end deftypefn - -@node Format Control -@subsection Choices in formatting - -These methods control (or report on) settings for some details of -controlling streams, primarily to do with formatting output: - -@deftypefn Method char ios::fill () const -Report on the padding character in use. -@end deftypefn - -@deftypefn Method char ios::fill (char @var{padding}) -Set the padding character. You can also use the manipulator -@code{setfill}. @xref{Manipulators,,Changing stream properties in -expressions}. - -Default: blank. -@end deftypefn - -@deftypefn Method int ios::precision () const -Report the number of significant digits currently in use for output of -floating point numbers. - -Default: @code{6}. -@end deftypefn - -@deftypefn Method int ios::precision (int @var{signif}) -Set the number of significant digits (for input and output numeric -conversions) to @var{signif}. - -@findex setprecision -@cindex setting @code{ios::precision} -You can also use the manipulator @code{setprecision} for this purpose. -@xref{Manipulators,,Changing stream properties using manipulators}. -@end deftypefn - -@deftypefn Method int ios::width () const -Report the current output field width setting (the number of -characters to write on the next @samp{<<} output operation). - -Default: @code{0}, which means to use as many characters as necessary. -@end deftypefn - -@deftypefn Method int ios::width (int @var{num}) -Set the input field width setting to @var{num}. Return the -@emph{previous} value for this stream. - -@findex setw -@cindex setting @code{ios::width} -This value resets to zero (the default) every time you use @samp{<<}; it is -essentially an additional implicit argument to that operator. You can -also use the manipulator @code{setw} for this purpose. -@xref{Manipulators,,Changing stream properties using manipulators}. -@end deftypefn - -@need 2000 -@deftypefn Method fmtflags ios::flags () const -Return the current value of the complete collection of flags controlling -the format state. These are the flags and their meanings when set: - -@vtable @code -@item ios::dec -@itemx ios::oct -@itemx ios::hex -What numeric base to use in converting integers from internal to display -representation, or vice versa: decimal, octal, or hexadecimal, -respectively. (You can change the base using the manipulator -@code{setbase}, or any of the manipulators @code{dec}, @code{oct}, or -@code{hex}; @pxref{Manipulators,,Changing stream properties in -expressions}.) - -On input, if none of these flags is set, read numeric constants -according to the prefix: decimal if no prefix (or a @samp{.} suffix), -octal if a @samp{0} prefix is present, hexadecimal if a @samp{0x} prefix -is present. - -Default: @code{dec}. - -@item ios::fixed -Avoid scientific notation, and always show a fixed number of digits after -the decimal point, according to the output precision in effect. -Use @code{ios::precision} to set precision. - -@item ios::left -@itemx ios::right -@itemx ios::internal -Where output is to appear in a fixed-width field; left-justified, -right-justified, or with padding in the middle (e.g. between a numeric -sign and the associated value), respectively. - -@item ios::scientific -Use scientific (exponential) notation to display numbers. - -@item ios::showbase -Display the conventional prefix as a visual indicator of the conversion -base: no prefix for decimal, @samp{0} for octal, @samp{0x} for hexadecimal. - -@item ios::showpoint -Display a decimal point and trailing zeros after it to fill out numeric -fields, even when redundant. - -@item ios::showpos -Display a positive sign on display of positive numbers. - -@item ios::skipws -Skip white space. (On by default). - -@item ios::stdio -Flush the C @code{stdio} streams @code{stdout} and @code{stderr} after -each output operation (for programs that mix C and C++ output conventions). - -@item ios::unitbuf -Flush after each output operation. - -@item ios::uppercase -Use upper-case characters for the non-numeral elements in numeric -displays; for instance, @samp{0X7A} rather than @samp{0x7a}, or -@samp{3.14E+09} rather than @samp{3.14e+09}. -@end vtable -@end deftypefn - -@deftypefn Method fmtflags ios::flags (fmtflags @var{value}) -Set @var{value} as the complete collection of flags controlling the -format state. The flag values are described under @samp{ios::flags ()}. - -Use @code{ios::setf} or @code{ios::unsetf} to change one property at a -time. -@end deftypefn - -@deftypefn Method fmtflags ios::setf (fmtflags @var{flag}) -Set one particular flag (of those described for @samp{ios::flags ()}; -return the complete collection of flags @emph{previously} in effect. -(Use @code{ios::unsetf} to cancel.) -@end deftypefn - -@deftypefn Method fmtflags ios::setf (fmtflags @var{flag}, fmtflags @var{mask}) -Clear the flag values indicated by @var{mask}, then set any of them that -are also in @var{flag}. (Flag values are described for @samp{ios::flags -()}.) Return the complete collection of flags @emph{previously} in -effect. (See @code{ios::unsetf} for another way of clearing flags.) -@end deftypefn - -@deftypefn Method fmtflags ios::unsetf (fmtflags @var{flag}) -Make certain @var{flag} (a combination of flag values described for -@samp{ios::flags ()}) is not set for this stream; converse of -@code{ios::setf}. Returns the old values of those flags. -@c FIXME-future: should probably be fixed to give same result as setf. -@end deftypefn - -@node Manipulators -@subsection Changing stream properties using manipulators - -For convenience, @var{manipulators} provide a way to change certain -properties of streams, or otherwise affect them, in the middle of -expressions involving @samp{<<} or @samp{>>}. For example, you might -write - -@example -cout << "|" << setfill('*') << setw(5) << 234 << "|"; -@end example - -@noindent -to produce @samp{|**234|} as output. - -@deftypefn Manipulator {} ws -Skip whitespace. -@end deftypefn - -@deftypefn Manipulator {} flush -Flush an output stream. For example, @samp{cout << @dots{} <<flush;} -has the same effect as @samp{cout << @dots{}; cout.flush();}. -@end deftypefn - -@deftypefn Manipulator {} endl -Write an end of line character @samp{\n}, then flushes the output stream. -@end deftypefn - -@deftypefn Manipulator {} ends -Write @samp{\0} (the string terminator character). -@end deftypefn - -@deftypefn Manipulator {} setprecision (int @var{signif}) -You can change the value of @code{ios::precision} in @samp{<<} -expressions with the manipulator @samp{setprecision(@var{signif})}; for -example, - -@example -cout << setprecision(2) << 4.567; -@end example - -@noindent -prints @samp{4.6}. Requires @file{#include <iomanip.h>}. -@end deftypefn - -@deftypefn Manipulator {} setw (int @var{n}) -You can change the value of @code{ios::width} in @samp{<<} expressions -with the manipulator @samp{setw(@var{n})}; for example, - -@example -cout << setw(5) << 234; -@end example - -@noindent -prints @w{@samp{ 234}} with two leading blanks. Requires @file{#include -<iomanip.h>}. -@end deftypefn - -@deftypefn Manipulator {} setbase (int @var{base}) -Where @var{base} is one of @code{10} (decimal), @code{8} (octal), or -@code{16} (hexadecimal), change the base value for numeric -representations. Requires @file{#include <iomanip.h>}. -@end deftypefn - -@deftypefn Manipulator {} dec -Select decimal base; equivalent to @samp{setbase(10)}. -@end deftypefn - -@deftypefn Manipulator {} hex -Select hexadecimal base; equivalent to @samp{setbase(16)}. -@end deftypefn - -@deftypefn Manipulator {} oct -Select octal base; equivalent to @samp{setbase(8)}. -@end deftypefn - -@deftypefn Manipulator {} setfill (char @var{padding}) -Set the padding character, in the same way as @code{ios::fill}. -Requires @file{#include <iomanip.h>}. -@end deftypefn - -@node Extending -@subsection Extended data fields - -A related collection of methods allows you to extend this collection of -flags and parameters for your own applications, without risk of conflict -between them: - -@deftypefn Method {static fmtflags} ios::bitalloc () -Reserve a bit (the single bit on in the result) to use as a flag. Using -@code{bitalloc} guards against conflict between two packages that use -@code{ios} objects for different purposes. - -This method is available for upward compatibility, but is not in the -@sc{ansi} working paper. The number of bits available is limited; a -return value of @code{0} means no bit is available. -@end deftypefn - -@deftypefn Method {static int} ios::xalloc () -Reserve space for a long integer or pointer parameter. The result is a -unique nonnegative integer. You can use it as an index to -@code{ios::iword} or @code{ios::pword}. Use @code{xalloc} to arrange -for arbitrary special-purpose data in your @code{ios} objects, without -risk of conflict between packages designed for different purposes. -@end deftypefn - -@deftypefn Method long& ios::iword (int @var{index}) -Return a reference to arbitrary data, of long integer type, stored in an -@code{ios} instance. @var{index}, conventionally returned from -@code{ios::xalloc}, identifies what particular data you need. -@end deftypefn - -@deftypefn Method long ios::iword (int @var{index}) const -Return the actual value of a long integer stored in an @code{ios}. -@end deftypefn - -@deftypefn Method void*& ios::pword (int @var{index}) -Return a reference to an arbitrary pointer, stored in an @code{ios} -instance. @var{index}, originally returned from @code{ios::xalloc}, -identifies what particular pointer you need. -@end deftypefn - -@deftypefn Method void* ios::pword (int @var{index}) const -Return the actual value of a pointer stored in an @code{ios}. -@end deftypefn - -@node Synchronization -@subsection Synchronizing related streams - -You can use these methods to synchronize related streams with -one another: - -@deftypefn Method ostream* ios::tie () const -Report on what output stream, if any, is to be flushed before accessing -this one. A pointer value of @code{0} means no stream is tied. -@end deftypefn - -@deftypefn Method ostream* ios::tie (ostream* @var{assoc}) -Declare that output stream @var{assoc} must be flushed before accessing -this stream. -@end deftypefn - -@deftypefn Method int ios::sync_with_stdio ([int @var{switch}]) -Unless iostreams and C @code{stdio} are designed to work together, you -may have to choose between efficient C++ streams output and output -compatible with C @code{stdio}. Use @samp{ios::sync_with_stdio()} to -select C compatibility. - -The argument @var{switch} is a @sc{gnu} extension; use @code{0} as the -argument to choose output that is not necessarily compatible with C -@code{stdio}. The default value for @var{switch} is @code{1}. - -If you install the @code{stdio} implementation that comes with @sc{gnu} -@code{libio}, there are compatible input/output facilities for both C -and C++. In that situation, this method is unnecessary---but you may -still want to write programs that call it, for portability. -@end deftypefn - -@node Streambuf from Ios -@subsection Reaching the underlying @code{streambuf} - -Finally, you can use this method to access the underlying object: - -@deftypefn Method streambuf* ios::rdbuf () const -Return a pointer to the @code{streambuf} object that underlies this -@code{ios}. -@end deftypefn - -@node Ostream -@section Managing output streams: class @code{ostream} - -Objects of class @code{ostream} inherit the generic methods from -@code{ios}, and in addition have the following methods available. -Declarations for this class come from @file{iostream.h}. - -@deftypefn Constructor {} ostream::ostream () -The simplest form of the constructor for an @code{ostream} simply -allocates a new @code{ios} object. -@end deftypefn - -@deftypefn Constructor {} ostream::ostream (streambuf* @var{sb} @w{[, ostream} @var{tie}]) -This alternative constructor requires a first argument @var{sb} of type -@code{streambuf*}, to use an existing open stream for output. It also -accepts an optional second argument @var{tie}, to specify a related -@code{ostream*} as the initial value for @code{ios::tie}. - -If you give the @code{ostream} a @code{streambuf} explicitly, using -this constructor, the @var{sb} is @emph{not} destroyed (or deleted or -closed) when the @code{ostream} is destroyed. -@end deftypefn - -@menu -* Writing:: Writing on an ostream. -* Output Position:: Repositioning an ostream. -* Ostream Housekeeping:: Miscellaneous ostream utilities. -@end menu - -@node Writing -@subsection Writing on an @code{ostream} - -These methods write on an @code{ostream} (you may also use the operator -@code{<<}; @pxref{Operators,,Operators and Default Streams}). - -@deftypefn Method ostream& ostream::put (char @var{c}) -Write the single character @var{c}. -@end deftypefn - -@deftypefn Method ostream& ostream::write (@var{string}, int @var{length}) -Write @var{length} characters of a string to this @code{ostream}, -beginning at the pointer @var{string}. - -@var{string} may have any of these types: @code{char*}, @code{unsigned -char*}, @code{signed char*}. -@end deftypefn - -@deftypefn Method ostream& ostream::form (const char *@var{format}, ...) -A @sc{gnu} extension, similar to @code{fprintf(@var{file}, -@var{format}, ...)}. - -@var{format} is a @code{printf}-style format control string, which is used -to format the (variable number of) arguments, printing the result on -this @code{ostream}. See @code{ostream::vform} for a version that uses -an argument list rather than a variable number of arguments. -@end deftypefn - -@deftypefn Method ostream& ostream::vform (const char *@var{format}, va_list @var{args}) -A @sc{gnu} extension, similar to @code{vfprintf(@var{file}, -@var{format}, @var{args})}. - -@var{format} is a @code{printf}-style format control string, which is used -to format the argument list @var{args}, printing the result on -this @code{ostream}. See @code{ostream::form} for a version that uses a -variable number of arguments rather than an argument list. -@end deftypefn - -@node Output Position -@subsection Repositioning an @code{ostream} - -You can control the output position (on output streams that actually -support positions, typically files) with these methods: -@c FIXME-future: sort out which classes support this and which -@c don't; fstream, filebuf? And what is failure condition when not supported? - -@deftypefn Method streampos ostream::tellp () -Return the current write position in the stream. -@end deftypefn - -@deftypefn Method ostream& ostream::seekp (streampos @var{loc}) -Reset the output position to @var{loc} (which is usually the result of a -previous call to @code{ostream::tellp}). @var{loc} specifies an -absolute position in the output stream. -@end deftypefn - -@deftypefn Method ostream& ostream::seekp (streamoff @var{loc}, @var{rel}) -@findex ios::seekdir -Reset the output position to @var{loc}, relative to the beginning, end, -or current output position in the stream, as indicated by @var{rel} (a -value from the enumeration @code{ios::seekdir}): - -@vtable @code -@item beg -Interpret @var{loc} as an absolute offset from the beginning of the -file. - -@item cur -Interpret @var{loc} as an offset relative to the current output -position. - -@item end -Interpret @var{loc} as an offset from the current end of the output -stream. -@end vtable -@end deftypefn - -@node Ostream Housekeeping -@subsection Miscellaneous @code{ostream} utilities - -You may need to use these @code{ostream} methods for housekeeping: - -@deftypefn Method ostream& flush () -Deliver any pending buffered output for this @code{ostream}. -@end deftypefn - -@deftypefn Method int ostream::opfx () -@code{opfx} is a @dfn{prefix} method for operations on @code{ostream} -objects; it is designed to be called before any further processing. See -@code{ostream::osfx} for the converse. -@c FIXME-future: specify sometime which methods start with opfx. - -@code{opfx} tests that the stream is in state @code{good}, and if so -flushes any stream tied to this one. - -The result is @code{1} when @code{opfx} succeeds; else (if the stream state is -not @code{good}), the result is @code{0}. -@end deftypefn - -@deftypefn Method void ostream::osfx () -@code{osfx} is a @dfn{suffix} method for operations on @code{ostream} -objects; it is designed to be called at the conclusion of any processing. All -the @code{ostream} methods end by calling @code{osfx}. See -@code{ostream::opfx} for the converse. - -If the @code{unitbuf} flag is set for this stream, @code{osfx} flushes -any buffered output for it. - -If the @code{stdio} flag is set for this stream, @code{osfx} flushes any -output buffered for the C output streams @file{stdout} and @file{stderr}. -@end deftypefn - -@node Istream -@section Managing input streams: class @code{istream} - -Class @code{istream} objects are specialized for input; as for -@code{ostream}, they are derived from @code{ios}, so you can use any of -the general-purpose methods from that base class. Declarations for this -class also come from @file{iostream.h}. - -@deftypefn Constructor {} istream::istream () -When used without arguments, the @code{istream} constructor simply -allocates a new @code{ios} object and initializes the input counter (the -value reported by @code{istream::gcount}) to @code{0}. -@end deftypefn - -@deftypefn Constructor {} istream::istream (streambuf *@var{sb} @w{[, ostream} @var{tie}]) -You can also call the constructor with one or two arguments. The first -argument @var{sb} is a @code{streambuf*}; if you supply this pointer, -the constructor uses that @code{streambuf} for input. -You can use the second optional argument @var{tie} to specify a related -output stream as the initial value for @code{ios::tie}. - -If you give the @code{istream} a @code{streambuf} explicitly, using -this constructor, the @var{sb} is @emph{not} destroyed (or deleted or -closed) when the @code{ostream} is destroyed. -@end deftypefn - -@menu -* Char Input:: Reading one character. -* String Input:: Reading strings. -* Input Position:: Repositioning an istream. -* Istream Housekeeping:: Miscellaneous istream utilities. -@end menu - -@node Char Input -@subsection Reading one character - -Use these methods to read a single character from the input stream: - -@deftypefn Method int istream::get () -Read a single character (or @code{EOF}) from the input stream, returning -it (coerced to an unsigned char) as the result. -@end deftypefn - -@deftypefn Method istream& istream::get (char& @var{c}) -Read a single character from the input stream, into @code{&@var{c}}. -@end deftypefn - -@deftypefn Method int istream::peek () -Return the next available input character, but @emph{without} changing -the current input position. -@end deftypefn - -@node String Input -@subsection Reading strings - -Use these methods to read strings (for example, a line at a time) from -the input stream: - -@deftypefn Method istream& istream::get (char* @var{c}, int @var{len} @w{[, char} @var{delim}]) -Read a string from the input stream, into the array at @var{c}. - -The remaining arguments limit how much to read: up to @samp{len-1} -characters, or up to (but not including) the first occurrence in the -input of a particular delimiter character @var{delim}---newline -(@code{\n}) by default. (Naturally, if the stream reaches end of file -first, that too will terminate reading.) - -If @var{delim} was present in the input, it remains available as if -unread; to discard it instead, see @code{iostream::getline}. - -@code{get} writes @samp{\0} at the end of the string, regardless -of which condition terminates the read. -@end deftypefn - -@deftypefn Method istream& istream::get (streambuf& @var{sb} @w{[, char} @var{delim}]) -Read characters from the input stream and copy them on the -@code{streambuf} object @var{sb}. Copying ends either just before the -next instance of the delimiter character @var{delim} (newline @code{\n} -by default), or when either stream ends. If @var{delim} was present in -the input, it remains available as if unread. -@end deftypefn - -@deftypefn Method istream& istream::getline (@var{charptr}, int @var{len} @w{[, char} @var{delim}]) -Read a line from the input stream, into the array at @var{charptr}. -@var{charptr} may be any of three kinds of pointer: @code{char*}, -@code{unsigned char*}, or @code{signed char*}. - -The remaining arguments limit how much to read: up to (but not -including) the first occurrence in the input of a line delimiter -character @var{delim}---newline (@code{\n}) by default, or up to -@samp{len-1} characters (or to end of file, if that happens sooner). - -If @code{getline} succeeds in reading a ``full line'', it also discards -the trailing delimiter character from the input stream. (To preserve it -as available input, see the similar form of @code{iostream::get}.) - -If @var{delim} was @emph{not} found before @var{len} characters or end -of file, @code{getline} sets the @code{ios::fail} flag, as well as the -@code{ios::eof} flag if appropriate. - -@code{getline} writes a null character at the end of the string, regardless -of which condition terminates the read. -@end deftypefn - -@deftypefn Method istream& istream::read (@var{pointer}, int @var{len}) -Read @var{len} bytes into the location at @var{pointer}, unless the -input ends first. - -@var{pointer} may be of type @code{char*}, @code{void*}, @code{unsigned -char*}, or @code{signed char*}. - -If the @code{istream} ends before reading @var{len} bytes, @code{read} -sets the @code{ios::fail} flag. -@end deftypefn - -@deftypefn Method istream& istream::gets (char **@var{s} @w{[, char} @var{delim}]) -A @sc{gnu} extension, to read an arbitrarily long string -from the current input position to the next instance of the @var{delim} -character (newline @code{\n} by default). - -To permit reading a string of arbitrary length, @code{gets} allocates -whatever memory is required. Notice that the first argument @var{s} is -an address to record a character pointer, rather than the pointer -itself. -@end deftypefn - -@deftypefn Method istream& istream::scan (const char *format ...) -A @sc{gnu} extension, similar to @code{fscanf(@var{file}, -@var{format}, ...)}. The @var{format} is a @code{scanf}-style format -control string, which is used to read the variables in the remainder of -the argument list from the @code{istream}. -@end deftypefn - -@deftypefn Method istream& istream::vscan (const char *format, va_list args) -Like @code{istream::scan}, but takes a single @code{va_list} argument. -@end deftypefn - -@node Input Position -@subsection Repositioning an @code{istream} - -Use these methods to control the current input position: - -@deftypefn Method streampos istream::tellg () -Return the current read position, so that you can save it and return to -it later with @code{istream::seekg}. -@end deftypefn - -@deftypefn Method istream& istream::seekg (streampos @var{p}) -Reset the input pointer (if the input device permits it) to @var{p}, -usually the result of an earlier call to @code{istream::tellg}. -@end deftypefn - -@deftypefn Method istream& istream::seekg (streamoff @var{offset}, ios::seek_dir @var{ref}) -Reset the input pointer (if the input device permits it) to @var{offset} -characters from the beginning of the input, the current position, or the -end of input. Specify how to interpret @var{offset} with one of these -values for the second argument: - -@vtable @code -@item ios::beg -Interpret @var{loc} as an absolute offset from the beginning of the -file. - -@item ios::cur -Interpret @var{loc} as an offset relative to the current output -position. - -@item ios::end -Interpret @var{loc} as an offset from the current end of the output -stream. -@end vtable -@end deftypefn - -@node Istream Housekeeping -@subsection Miscellaneous @code{istream} utilities - -Use these methods for housekeeping on @code{istream} objects: - -@deftypefn Method int istream::gcount () -Report how many characters were read from this @code{istream} in the -last unformatted input operation. -@c FIXME! Define "unformatted input" somewhere... -@end deftypefn - -@deftypefn Method int istream::ipfx (int @var{keepwhite}) -Ensure that the @code{istream} object is ready for reading; check for -errors and end of file and flush any tied stream. @code{ipfx} skips -whitespace if you specify @code{0} as the @var{keepwhite} -argument, @emph{and} @code{ios::skipws} is set for this stream. - -To avoid skipping whitespace (regardless of the @code{skipws} setting on -the stream), use @code{1} as the argument. - -Call @code{istream::ipfx} to simplify writing your own methods for reading -@code{istream} objects. -@end deftypefn - -@deftypefn Method void istream::isfx () -A placeholder for compliance with the draft @sc{ansi} standard; this -method does nothing whatever. - -If you wish to write portable standard-conforming code on @code{istream} -objects, call @code{isfx} after any operation that reads from an -@code{istream}; if @code{istream::ipfx} has any special effects that -must be cancelled when done, @code{istream::isfx} will cancel them. -@end deftypefn - -@deftypefn Method istream& istream::ignore ([int @var{n}] @w{[, int} @var{delim}]) -Discard some number of characters pending input. The first optional -argument @var{n} specifies how many characters to skip. The second -optional argument @var{delim} specifies a ``boundary'' character: -@code{ignore} returns immediately if this character appears in the -input. - -By default, @var{delim} is @code{EOF}; that is, if you do not specify a -second argument, only the count @var{n} restricts how much to ignore -(while input is still available). - -If you do not specify how many characters to ignore, @code{ignore} -returns after discarding only one character. -@end deftypefn - -@deftypefn Method istream& istream::putback (char @var{ch}) -Attempts to back up one character, replacing the character backed-up -over by @var{ch}. Returns @code{EOF} if this is not allowed. Putting -back the most recently read character is always allowed. (This method -corresponds to the C function @code{ungetc}.) -@end deftypefn - -@deftypefn Method istream& istream::unget () -Attempt to back up one character. -@end deftypefn - -@node Iostream -@section Input and output together: class @code{iostream} - -If you need to use the same stream for input and output, you can use an -object of the class @code{iostream}, which is derived from @emph{both} -@code{istream} and @code{ostream}. - -The constructors for @code{iostream} behave just like the constructors -for @code{istream}. - -@deftypefn Constructor {} iostream::iostream () -When used without arguments, the @code{iostream} constructor simply -allocates a new @code{ios} object, and initializes the input counter -(the value reported by @code{istream::gcount}) to @code{0}. -@end deftypefn - -@deftypefn Constructor {} iostream::iostream (streambuf* @var{sb} @w{[, ostream*} @var{tie}]) -You can also call a constructor with one or two arguments. The first -argument @var{sb} is a @code{streambuf*}; if you supply this pointer, -the constructor uses that @code{streambuf} for input and output. - -You can use the optional second argument @var{tie} (an @code{ostream*}) -to specify a related output stream as the initial value for -@code{ios::tie}. -@end deftypefn - -@cindex @code{iostream} destructor -@cindex destructor for @code{iostream} -As for @code{ostream} and @code{istream}, @code{iostream} simply uses -the @code{ios} destructor. However, an @code{iostream} is not deleted by -its destructor. - -You can use all the @code{istream}, @code{ostream}, and @code{ios} -methods with an @code{iostream} object. - -@node Files and Strings -@chapter Classes for Files and Strings - -There are two very common special cases of input and output: using files, -and using strings in memory. - -@code{libio} defines four specialized classes for these cases: - -@ftable @code -@item ifstream -Methods for reading files. - -@item ofstream -Methods for writing files. - -@item istrstream -Methods for reading strings from memory. - -@item ostrstream -Methods for writing strings in memory. -@end ftable - -@menu -* Files:: Reading and writing files. -* Strings:: Reading and writing strings in memory. -@end menu - -@node Files -@section Reading and writing files - -These methods are declared in @file{fstream.h}. - -@findex ifstream -@cindex class @code{ifstream} -You can read data from class @code{ifstream} with any operation from class -@code{istream}. There are also a few specialized facilities: - -@deftypefn Constructor {} ifstream::ifstream () -Make an @code{ifstream} associated with a new file for input. (If you -use this version of the constructor, you need to call -@code{ifstream::open} before actually reading anything) -@end deftypefn - -@deftypefn Constructor {} ifstream::ifstream (int @var{fd}) -Make an @code{ifstream} for reading from a file that was already open, -using file descriptor @var{fd}. (This constructor is compatible with -other versions of iostreams for @sc{posix} systems, but is not part of -the @sc{ansi} working paper.) -@end deftypefn - -@deftypefn Constructor {} ifstream::ifstream (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]]) -Open a file @code{*@var{fname}} for this @code{ifstream} object. - -By default, the file is opened for input (with @code{ios::in} as -@var{mode}). If you use this constructor, the file will be closed when -the @code{ifstream} is destroyed. - -You can use the optional argument @var{mode} to specify how to open the -file, by combining these enumerated values (with @samp{|} bitwise or). -(These values are actually defined in class @code{ios}, so that all -file-related streams may inherit them.) Only some of these modes are -defined in the latest draft @sc{ansi} specification; if portability is -important, you may wish to avoid the others. - -@vtable @code -@item ios::in -Open for input. (Included in @sc{ansi} draft.) - -@item ios::out -Open for output. (Included in @sc{ansi} draft.) - -@item ios::ate -Set the initial input (or output) position to the end of the file. - -@item ios::app -Seek to end of file before each write. (Included in @sc{ansi} draft.) - -@item ios::trunc -Guarantee a fresh file; discard any contents that were previously -associated with it. - -@item ios::nocreate -Guarantee an existing file; fail if the specified file did not already -exist. - -@item ios::noreplace -Guarantee a new file; fail if the specified file already existed. - -@item ios::bin -Open as a binary file (on systems where binary and text files have different -properties, typically how @samp{\n} is mapped; included in @sc{ansi} draft). -@end vtable - -@noindent -The last optional argument @var{prot} is specific to Unix-like systems; -it specifies the file protection (by default @samp{644}). -@end deftypefn - -@deftypefn Method void ifstream::open (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]]) -Open a file explicitly after the associated @code{ifstream} object -already exists (for instance, after using the default constructor). The -arguments, options and defaults all have the same meanings as in the -fully specified @code{ifstream} constructor. -@end deftypefn - -@findex ostream -@cindex class @code{ostream} -You can write data to class @code{ofstream} with any operation from class -@code{ostream}. There are also a few specialized facilities: - -@deftypefn Constructor {} ofstream::ofstream () -Make an @code{ofstream} associated with a new file for output. -@end deftypefn - -@deftypefn Constructor {} ofstream::ofstream (int @var{fd}) -Make an @code{ofstream} for writing to a file that was already open, -using file descriptor @var{fd}. -@end deftypefn - -@deftypefn Constructor {} ofstream::ofstream (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]]) -Open a file @code{*@var{fname}} for this @code{ofstream} object. - -By default, the file is opened for output (with @code{ios::out} as @var{mode}). -You can use the optional argument @var{mode} to specify how to open the -file, just as described for @code{ifstream::ifstream}. - -The last optional argument @var{prot} specifies the file protection (by -default @samp{644}). -@end deftypefn - -@deftypefn Destructor {} ofstream::~ofstream () -The files associated with @code{ofstream} objects are closed when the -corresponding object is destroyed. -@end deftypefn - -@deftypefn Method void ofstream::open (const char* @var{fname} @w{[, int} @var{mode} @w{[, int} @var{prot}]]) -Open a file explicitly after the associated @code{ofstream} object -already exists (for instance, after using the default constructor). The -arguments, options and defaults all have the same meanings as in the -fully specified @code{ofstream} constructor. -@end deftypefn - -@findex fstream -@cindex class @code{fstream} -The class @code{fstream} combines the facilities of @code{ifstream} and -@code{ofstream}, just as @code{iostream} combines @code{istream} and -@code{ostream}. - -@c FIXME-future: say something about fstream constructor, maybe. - -@findex fstreambase -@cindex class @code{fstreambase} -The class @code{fstreambase} underlies both @code{ifstream} and -@code{ofstream}. They both inherit this additional method: - -@deftypefn Method void fstreambase::close () -Close the file associated with this object, and set @code{ios::fail} in -this object to mark the event. -@end deftypefn - -@node Strings -@section Reading and writing in memory - -@c FIXME!! Per, there's a lot of guesswork here---please check carefully! - -@findex istrstream -@cindex class @code{istrstream} -@findex ostrstream -@cindex class @code{ostrstream} -@findex strstream -@cindex class @code{strstream} -@findex strstreambase -@cindex class @code{strstreambase} -@findex strstreambuf -@cindex class @code{strstreambuf} -The classes @code{istrstream}, @code{ostrstream}, and @code{strstream} -provide some additional features for reading and writing strings in -memory---both static strings, and dynamically allocated strings. The -underlying class @code{strstreambase} provides some features common to -all three; @code{strstreambuf} underlies that in turn. - -@c FIXME-future: Document strstreambuf methods one day, when we document -@c streambuf more fully. - -@deftypefn Constructor {} istrstream::istrstream (const char* @var{str} @w{[, int} @var{size}]) -Associate the new input string class @code{istrstream} with an existing -static string starting at @var{str}, of size @var{size}. If you do not -specify @var{size}, the string is treated as a @code{NUL} terminated string. -@end deftypefn - -@deftypefn Constructor {} ostrstream::ostrstream () -Create a new stream for output to a dynamically managed string, which -will grow as needed. -@end deftypefn - -@deftypefn Constructor {} ostrstream::ostrstream (char* @var{str}, int @var{size} [,int @var{mode}]) -A new stream for output to a statically defined string of length -@var{size}, starting at @var{str}. You may optionally specify one of -the modes described for @code{ifstream::ifstream}; if you do not specify -one, the new stream is simply open for output, with mode @code{ios::out}. -@end deftypefn - -@deftypefn Method int ostrstream::pcount () -Report the current length of the string associated with this @code{ostrstream}. -@end deftypefn - -@deftypefn Method char* ostrstream::str () -A pointer to the string managed by this @code{ostrstream}. Implies -@samp{ostrstream::freeze()}. - -Note that if you want the string to be nul-terminated, -you must do that yourself (perhaps by writing ends to the stream). -@end deftypefn - -@deftypefn Method void ostrstream::freeze ([int @var{n}]) -If @var{n} is nonzero (the default), declare that the string associated -with this @code{ostrstream} is not to change dynamically; while frozen, -it will not be reallocated if it needs more space, and it will not be -deallocated when the @code{ostrstream} is destroyed. Use -@samp{freeze(1)} if you refer to the string as a pointer after creating -it via @code{ostrstream} facilities. - -@samp{freeze(0)} cancels this declaration, allowing a dynamically -allocated string to be freed when its @code{ostrstream} is destroyed. - -If this @code{ostrstream} is already static---that is, if it was created -to manage an existing statically allocated string---@code{freeze} is -unnecessary, and has no effect. -@end deftypefn - -@deftypefn Method int ostrstream::frozen () -Test whether @code{freeze(1)} is in effect for this string. -@end deftypefn - -@deftypefn Method strstreambuf* strstreambase::rdbuf () -A pointer to the underlying @code{strstreambuf}. -@end deftypefn - -@node Streambuf -@chapter Using the @code{streambuf} Layer - -The @code{istream} and @code{ostream} classes are meant to handle -conversion between objects in your program and their textual representation. - -By contrast, the underlying @code{streambuf} class is for transferring -raw bytes between your program, and input sources or output sinks. -Different @code{streambuf} subclasses connect to different kinds of -sources and sinks. - -The @sc{gnu} implementation of @code{streambuf} is still evolving; we -describe only some of the highlights. - -@menu -* Areas:: Areas in a streambuf. -* Overflow:: Simple output re-direction -* Formatting:: C-style formatting for streambuf objects. -* Stdiobuf:: Wrappers for C stdio. -* Procbuf:: Reading/writing from/to a pipe -* Backing Up:: Marking and returning to a position. -* Indirectbuf:: Forwarding I/O activity. -@end menu - -@node Areas -@section Areas of a @code{streambuf} - -Streambuf buffer management is fairly sophisticated (this is a -nice way to say ``complicated''). The standard protocol -has the following ``areas'': - -@itemize @bullet -@item -@cindex put area -The @dfn{put area} contains characters waiting for output. - -@item -@cindex get area -The @dfn{get area} contains characters available for reading. -@end itemize - -The @sc{gnu} @code{streambuf} design extends this, but the details are -still evolving. - -The following methods are used to manipulate these areas. -These are all protected methods, which are intended to be -used by virtual function in classes derived from @code{streambuf}. -They are also all ANSI/ISO-standard, and the ugly names -are traditional. -(Note that if a pointer points to the 'end' of an area, -it means that it points to the character after the area.) - -@deftypefn Method char* streambuf::pbase () const -Returns a pointer to the start of the put area. -@end deftypefn - -@deftypefn Method char* streambuf::epptr () const -Returns a pointer to the end of the put area. -@end deftypefn - -@deftypefn Method char* streambuf::pptr () const -If @code{pptr() < epptr ()}, the @code{pptr()} -returns a pointer to the current put position. -(In that case, the next write will -overwrite @code{*pptr()}, and increment @code{pptr()}.) -Otherwise, there is no put position available -(and the next character written will cause @code{streambuf::overflow} -to be called). -@end deftypefn - -@deftypefn Method void streambuf::pbump (int @var{N}) -Add @var{N} to the current put pointer. -No error checking is done. -@end deftypefn - -@deftypefn Method void streambuf::setp (char* @var{P}, char* @var{E}) -Sets the start of the put area to @var{P}, the end of the put area to @var{E}, -and the current put pointer to @var{P} (also). -@end deftypefn - -@deftypefn Method char* streambuf::eback () const -Returns a pointer to the start of the get area. -@end deftypefn - -@deftypefn Method char* streambuf::egptr () const -Returns a pointer to the end of the get area. -@end deftypefn - -@deftypefn Method char* streambuf::gptr () const -If @code{gptr() < egptr ()}, then @code{gptr()} -returns a pointer to the current get position. -(In that case the next read will read @code{*gptr()}, -and possibly increment @code{gptr()}.) -Otherwise, there is no read position available -(and the next read will cause @code{streambuf::underflow} -to be called). -@end deftypefn - -@deftypefn Method void streambuf:gbump (int @var{N}) -Add @var{N} to the current get pointer. -No error checking is done. -@end deftypefn - -@deftypefn Method void streambuf::setg (char* @var{B}, char* @var{P}, char* @var{E}) -Sets the start of the get area to @var{B}, the end of the get area to @var{E}, -and the current put pointer to @var{P}. -@end deftypefn - -@node Overflow -@section Simple output re-direction by redefining @code{overflow} - -Suppose you have a function @code{write_to_window} that -writes characters to a @code{window} object. If you want to use the -ostream function to write to it, here is one (portable) way to do it. -This depends on the default buffering (if any). - -@cartouche -@smallexample -#include <iostream.h> -/* Returns number of characters successfully written to @var{win}. */ -extern int write_to_window (window* win, char* text, int length); - -class windowbuf : public streambuf @{ - window* win; - public: - windowbuf (window* w) @{ win = w; @} - int sync (); - int overflow (int ch); - // Defining xsputn is an optional optimization. - // (streamsize was recently added to ANSI C++, not portable yet.) - streamsize xsputn (char* text, streamsize n); -@}; - -int windowbuf::sync () -@{ streamsize n = pptr () - pbase (); - return (n && write_to_window (win, pbase (), n) != n) ? EOF : 0; -@} - -int windowbuf::overflow (int ch) -@{ streamsize n = pptr () - pbase (); - if (n && sync ()) - return EOF; - if (ch != EOF) - @{ - char cbuf[1]; - cbuf[0] = ch; - if (write_to_window (win, cbuf, 1) != 1) - return EOF; - @} - pbump (-n); // Reset pptr(). - return 0; -@} - -streamsize windowbuf::xsputn (char* text, streamsize n) -@{ return sync () == EOF ? 0 : write_to_window (win, text, n); @} - -int -main (int argc, char**argv) -@{ - window *win = ...; - windowbuf wbuf(win); - ostream wstr(&wbuf); - wstr << "Hello world!\n"; -@} -@end smallexample -@end cartouche - - - -@node Formatting -@section C-style formatting for @code{streambuf} objects - -The @sc{gnu} @code{streambuf} class supports @code{printf}-like -formatting and scanning. - -@deftypefn Method int streambuf::form (const char *@var{format}, ...) -Similar to @code{fprintf(@var{file}, @var{format}, ...)}. -The @var{format} is a @code{printf}-style format control string, which is used -to format the (variable number of) arguments, printing the result on -the @code{this} streambuf. The result is the number of characters printed. -@end deftypefn - -@deftypefn Method int streambuf::vform (const char *@var{format}, va_list @var{args}) -Similar to @code{vfprintf(@var{file}, @var{format}, @var{args})}. -The @var{format} is a @code{printf}-style format control string, which is used -to format the argument list @var{args}, printing the result on -the @code{this} streambuf. The result is the number of characters printed. -@end deftypefn - -@deftypefn Method int streambuf::scan (const char *@var{format}, ...) -Similar to @code{fscanf(@var{file}, @var{format}, ...)}. -The @var{format} is a @code{scanf}-style format control string, which is used -to read the (variable number of) arguments from the @code{this} streambuf. -The result is the number of items assigned, or @code{EOF} in case of -input failure before any conversion. -@end deftypefn - -@deftypefn Method int streambuf::vscan (const char *@var{format}, va_list @var{args}) -Like @code{streambuf::scan}, but takes a single @code{va_list} argument. -@end deftypefn - -@node Stdiobuf -@section Wrappers for C @code{stdio} - -A @dfn{stdiobuf} is a @code{streambuf} object that points to -a @code{FILE} object (as defined by @code{stdio.h}). -All @code{streambuf} operations on the @code{stdiobuf} are forwarded -to the @code{FILE}. Thus the @code{stdiobuf} object provides a -wrapper around a @code{FILE}, allowing use of @code{streambuf} -operations on a @code{FILE}. This can be useful when mixing -C code with C++ code. - -The pre-defined streams @code{cin}, @code{cout}, and @code{cerr} are -normally implemented as @code{stdiobuf} objects that point to -respectively @code{stdin}, @code{stdout}, and @code{stderr}. This is -convenient, but it does cost some extra overhead. - -If you set things up to use the implementation of @code{stdio} provided -with this library, then @code{cin}, @code{cout}, and @code{cerr} will be -set up to to use @code{stdiobuf} objects, since you get their benefits -for free. @xref{Stdio,,C Input and Output}. - -@ignore -@c FIXME-future: setbuf is not yet documented, hence this para is not useful. -Note that if you use @code{setbuf} to give a buffer to a @code{stdiobuf}, -that buffer will provide intermediate buffering in addition that -whatever is done by the @code{FILE}. -@end ignore - -@node Procbuf -@section Reading/writing from/to a pipe - -The @dfn{procbuf} class is a @sc{gnu} extension. It is derived from -@code{streambuf}. A @code{procbuf} can be @dfn{closed} (in which case -it does nothing), or @dfn{open} (in which case it allows communicating -through a pipe with some other program). - -@deftypefn Constructor {} procbuf::procbuf () -Creates a @code{procbuf} in a @dfn{closed} state. -@end deftypefn - -@deftypefn Method procbuf* procbuf::open (const char *@var{command}, int @var{mode}) -Uses the shell (@file{/bin/sh}) to run a program specified by @var{command}. - -If @var{mode} is @samp{ios::in}, standard output from the program is sent -to a pipe; you can read from the pipe by reading from the -@code{procbuf}. (This is similar to @w{@samp{popen(@var{command}, "r")}}.) - -If @var{mode} is @samp{ios::out}, output written written to the -@code{procbuf} is written to a pipe; the program is set up to read its -standard input from (the other end of) the pipe. (This is similar to -@w{@samp{popen(@var{command}, "w")}}.) - -The @code{procbuf} must start out in the @dfn{closed} state. -Returns @samp{*this} on success, and @samp{NULL} on failure. -@end deftypefn - -@deftypefn Constructor {} procbuf::procbuf (const char *@var{command}, int @var{mode}) -Calls @samp{procbuf::open (@var{command}, @var{mode})}. -@end deftypefn - -@deftypefn Method procbuf* procbuf::close () -Waits for the program to finish executing, -and then cleans up the resources used. -Returns @samp{*this} on success, and @samp{NULL} on failure. -@end deftypefn - -@deftypefn Destructor {} procbuf::~procbuf () -Calls @samp{procbuf::close}. -@end deftypefn - -@node Backing Up -@section Backing up - -The @sc{gnu} iostream library allows you to ask a @code{streambuf} to -remember the current position. This allows you to go back to this -position later, after reading further. You can back up arbitrary -amounts, even on unbuffered files or multiple buffers' worth, as long as -you tell the library in advance. This unbounded backup is very useful -for scanning and parsing applications. This example shows a typical -scenario: - -@cartouche -@smallexample -// Read either "dog", "hound", or "hounddog". -// If "dog" is found, return 1. -// If "hound" is found, return 2. -// If "hounddog" is found, return 3. -// If none of these are found, return -1. -int my_scan(streambuf* sb) -@{ - streammarker fence(sb); - char buffer[20]; - // Try reading "hounddog": - if (sb->sgetn(buffer, 8) == 8 - && strncmp(buffer, "hounddog", 8) == 0) - return 3; - // No, no "hounddog": Back up to 'fence' - sb->seekmark(fence); // - // ... and try reading "dog": - if (sb->sgetn(buffer, 3) == 3 - && strncmp(buffer, "dog", 3) == 0) - return 1; - // No, no "dog" either: Back up to 'fence' - sb->seekmark(fence); // - // ... and try reading "hound": - if (sb->sgetn(buffer, 5) == 5 - && strncmp(buffer, "hound", 5) == 0) - return 2; - // No, no "hound" either: Back up and signal failure. - sb->seekmark(fence); // Backup to 'fence' - return -1; -@} -@end smallexample -@end cartouche - -@deftypefn Constructor {} streammarker::streammarker (streambuf* @var{sbuf}) -Create a @code{streammarker} associated with @var{sbuf} -that remembers the current position of the get pointer. -@end deftypefn - -@deftypefn Method int streammarker::delta (streammarker& @var{mark2}) -Return the difference between the get positions corresponding -to @code{*this} and @var{mark2} (which must point into the same -@code{streambuffer} as @code{this}). -@end deftypefn - -@deftypefn Method int streammarker::delta () -Return the position relative to the streambuffer's current get position. -@end deftypefn - -@deftypefn Method int streambuf::seekmark (streammarker& @var{mark}) -Move the get pointer to where it (logically) was when @var{mark} -was constructed. -@end deftypefn - -@node Indirectbuf -@section Forwarding I/O activity - -An @dfn{indirectbuf} is one that forwards all of its I/O requests -to another streambuf. - -@ignore -@c FIXME-future: get_stream and put_stream are so far undocumented. -All get-related requests are sent to get_stream(). -All put-related requests are sent to put_stream(). -@end ignore - -An @code{indirectbuf} can be used to implement Common Lisp -synonym-streams and two-way-streams: - -@example -class synonymbuf : public indirectbuf @{ - Symbol *sym; - synonymbuf(Symbol *s) @{ sym = s; @} - virtual streambuf *lookup_stream(int mode) @{ - return coerce_to_streambuf(lookup_value(sym)); @} -@}; -@end example - -@node Stdio -@chapter C Input and Output - -@code{libio} is distributed with a complete implementation of the ANSI C -@code{stdio} facility. It is implemented using @code{streambuf} -objects. @xref{Stdiobuf,,Wrappers for C @code{stdio}}. - -The @code{stdio} package is intended as a replacement for the whatever -@code{stdio} is in your C library. -@ignore -@c FIXME-future: This is not useful unless we specify what problems. -It can co-exist with C libraries that have alternate implementations of -stdio, but there may be some problems. -@end ignore -Since @code{stdio} works best when you build @code{libc} to contain it, and -that may be inconvenient, it is not installed by default. - -Extensions beyond @sc{ansi}: - -@itemize @bullet -@item -A stdio @code{FILE} is identical to a streambuf. -Hence there is no need to worry about synchronizing C and C++ -input/output---they are by definition always synchronized. - -@item -If you create a new streambuf sub-class (in C++), you can use it as a -@code{FILE} from C. Thus the system is extensible using the standard -@code{streambuf} protocol. - -@item -You can arbitrarily mix reading and writing, without having to seek -in between. - -@item -Unbounded @code{ungetc()} buffer. -@end itemize - -@ignore -@c FIXME-future: Per says this is not ready to go public at v0.5 -@node Libio buffer management -@chapter Libio buffer management - -The libio user functions present an abstract sequence of characters, -that they read and write from. A number of buffers are used to go -between the user program and the abstract sequence. These buffers are -concrete arrays of characters that contain some sub-sequence of the -abstract sequence. - -The libio buffer management protocol is fairly complex. Its design is -based on the C++ @code{streambuf} protocol, so that the C++ -@code{streambuf} classes can be trivially implemented on top of the -libio protocol. - -The @dfn{write area} contains characters waiting for output. - -The @dfn{read area} contains characters available for reading. - -The @dfn{reserve area} is available to virtual methods. -Usually, the get and/or put areas are part of the reserve area. - -The @dfn{main get area} contains characters that have -been read in from the character source, but not yet -read by the application. - -The @dfn{backup area} contains previously read data that is being saved -because of a user request, or that have been "unread" (put back). -@end ignore - -@ignore -@c Per says this design is not finished -@node Streambuf internals -@chapter Streambuf internals - -@menu -* Buffer management:: -* Filebuf internals:: -@end menu - -@node Buffer management -@section Buffer management - -@subsection Areas - -NOTE: This chapter is due for an update. - -Streambuf buffer management is fairly sophisticated (this is a -nice way to say "complicated"). The standard protocol -has the following "areas": - -@itemize @bullet -@cindex put area -@item -The @dfn{put area} contains characters waiting for output. -@cindex get area -@item -The @dfn{get area} contains characters available for reading. -@cindex reserve area -@item -The @dfn{reserve area} is available to virtual methods. -Usually, the get and/or put areas are part of the reserve area. -@end itemize - -The @sc{gnu} @code{streambuf} design extends this by supporting two -get areas: -@itemize @bullet -@cindex main get area -@item -The @dfn{main get area} contains characters that have -been read in from the character source, but not yet -read by the application. -@cindex backup area -@item -The @dfn{backup area} contains previously read data that is being -saved because of a user request, or that have been "unread" (putback). -@end itemize - -The backup and the main get area are logically contiguous: That is, -the first character of the main get area follows the last character -of the backup area. - -The @dfn{current get area} is whichever one of the backup or -main get areas that is currently being read from. -The other of the two is the @dfn{non-current get area}. - -@subsection Pointers - -The following @code{char*} pointers define the various areas. - -@deftypefn Method char* streambuf::base () -The start of the reserve area. -@end deftypefn - -@deftypefn Method char* streambuf::ebuf () -The end of the reserve area. -@end deftypefn - -@deftypefn Method char* streambuf::Gbase () -The start of the main get area. -@end deftypefn - -@deftypefn Method char* streambuf::eGptr () -The end of the main get area. -@end deftypefn - -@deftypefn Method char* streambuf::Bbase () -The start of the backup area. -@end deftypefn - -@deftypefn Method char* streambuf::Bptr () -The start of the used part of the backup area. -The area (@code{Bptr()} .. @code{eBptr()}) contains data that has been -pushed back, while (@code{Bbase()} .. @code{eBptr()}) contains unused -space available for future putbacks. -@end deftypefn - -@deftypefn Method char* streambuf::eBptr () -The end of the backup area. -@end deftypefn - -@deftypefn Method char* streambuf::Nbase () -The start of the non-current get area (either @code{main_gbase} or @code{backup_gbase}). -@end deftypefn - -@deftypefn Method char* streambuf::eNptr () -The end of the non-current get area. -@end deftypefn - -@node Filebuf internals -@section Filebuf internals - -The @code{filebuf} is used a lot, so it is importamt that it be -efficient. It is also supports rather complex semantics. -so let us examine its implementation. - -@subsection Tied read and write pointers - -The streambuf model allows completely independent read and write pointers. -However, a @code{filebuf} has only a single logical pointer used -for both reads and writes. Since the @code{streambuf} protocol -uses @code{gptr()} for reading and @code{pptr()} for writing, -we map the logical file pointer into either @code{gptr()} or @code{pptr()} -at different times. - -@itemize @bullet -@item -Reading is allowed when @code{gptr() < egptr()}, which we call get mode. - -@item -Writing is allowed when @code{pptr() < epptr()}, which we call put mode. -@end itemize - -@noindent -A @code{filebuf} cannot be in get mode and put mode at the same time. - -We have up to two buffers: - -@itemize @bullet -@item -The backup area, defined by @code{Bbase()}, @code{Bptr()}, and @code{eBptr()}. -This can be empty. - -@item -The reserve area, which also contains the main get area. -For an unbuffered file, the (@code{shortbuf()}..@code{shortbuf()+1}) is used, -where @code{shortbuf()} points to a 1-byte buffer that is part of -the @code{filebuf}. -@end itemize - -@noindent -The file system's idea of the current position is @code{eGptr()}. - -Characters that have been written into a buffer but not yet written -out (flushed) to the file systems are those between @code{pbase()} -and @code{pptr()}. - -The end of the valid data bytes is: -@code{pptr() > eGptr() && pptr() < ebuf() ? pptr() : eGptr()}. - -If the @code{filebuf} is unbuffered or line buffered, -the @code{eptr()} is @code{pbase()}. This forces a call -to @code{overflow()} on each put of a character. -The logical @code{epptr()} is @code{epptr() ? ebuf() : NULL}. -(If the buffer is read-only, set @code{pbase()}, @code{pptr()}, -and @code{epptr()} to @code{NULL}. NOT!) -@end ignore - -@node Index -@unnumbered Index -@printindex cp - -@contents -@bye |