home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / oldstr.doc < prev    next >
Text File  |  1990-06-09  |  38KB  |  1,108 lines

  1. HOW TO USE THIS FILE: This file has a table of contents and
  2. an index that refer to "pages" in this file. If your editor
  3. has a search facility, you can use it to search for the page
  4. numbers listed in either the table of contents or in the index.
  5. The phrase "Page n" (where n represents the actual page number)
  6. appears at the bottom left of the "page" it refers to. Thus, at
  7. the bottom of page 1, you'll find "Page 1" as the last item on
  8. that "page."
  9.  
  10.                    C++ VERSION 1.2 STREAMS
  11.                       TABLE OF CONTENTS
  12. ___________________________________________________________________
  13.  
  14. Overview                       1       Get functions . . . . . .  8
  15. Output . . . . . . . . . . . . 1       Putback (function)  . . .  8
  16.   Built-in types . . . . . . . 2       Controlling whitespace
  17.   Put functions  . . . . . . . 2       skipping  . . . . . . . .  9
  18.   Built-in formatting                User-defined types  . . . . 10
  19.   functions  . . . . . . . . . 2     Initializing streams  . . . 10
  20.     Numeric conversion . . . . 3     Output streams  . . . . . . 10
  21.     Character string                 Input streams . . . . . . . 11
  22.     conversion . . . . . . . . 4   File I/O  . . . . . . . . . . 12
  23.     General Formatting . . . . 5   Buffering streams . . . . . . 15
  24.   User-defined types . . . . . 6   String I/O  . . . . . . . . . 16
  25. Input  . . . . . . . . . . . . 6   Stream states . . . . . . . . 18
  26.   Built-in types . . . . . . . 7
  27.   Controlling whitespace . . . 7   Index                         19
  28.  
  29.  
  30. OVERVIEW
  31.  
  32. This file describes C++ version 1.2 stream I/O. If you are planning
  33. to program using or converting over to version 2.0 streams, see
  34. Chapter 3, "C++ streams," in the Programmer's Guide.
  35.  
  36. Stream I/O in C++ is used to convert typed objects into readable text,
  37. and vice-versa. It provides an easier and more intelligent alternative
  38. to printf and scanf, and allows you to define input/output functions
  39. which are then used automatically for corresponding user-defined
  40. types. To access stream I/O, use the directive #include <stream.h>.
  41.  
  42. C++ programs start with three predefined open streams. These are
  43. called cin, cout, and cerr. They correspond to the standard input,
  44. output and error (stdin, stdout, and stderr) files of standard I/O
  45. in C. You can reassign these standard names to other files or
  46. character buffers after program startup.
  47.  
  48.  
  49. Output
  50.  
  51. Stream output is accomplished via the << (put to) operator, which
  52. is overloaded for stream output. Its left operand is an object
  53. whose type is class ostream. Its right operand is any type for
  54. which stream output has been defined (more about this later).
  55. Stream output is predefined for built-in types. For example,
  56.  
  57.    cout << "Hello\n"
  58.  
  59. writes the string "Hello" to cout (normally the standard output
  60. file) followed by a newline.
  61.  
  62. The << operator binds left to right and returns its left operand,
  63. so that several output operations may be combined in one statement.
  64. For example,
  65.  
  66.   void function display(int i, double d)
  67.   {
  68.      cout << "i = " << i << ", d = " << d << "\n";
  69.   }
  70.  
  71. Page 1
  72.  
  73. will write something like
  74.  
  75.    i = 8, d = 2.34
  76.  
  77. to standard output.
  78.  
  79.  
  80.   Built-in types
  81.  
  82. The types directly supported for output, as in the example above,
  83. are the built-in types char (both signed and unsigned), short, int,
  84. long, char * (treated as a string), float, long double, and double.
  85. Integral types are converted according to the default rules for the
  86. ANSI C function printf. That is, for example, given the declara-
  87. tions int i; long l;, the two statements
  88.  
  89.   cout << i << " " << l;
  90.   printf("%d %ld", i, l);
  91.  
  92. produce the same result.
  93.  
  94. Similarly, floating-point types are converted according to the
  95. default rules for the %g conversion. That is, for example, given
  96. the declaration double d, the statements
  97.  
  98.   cout << d;
  99.   printf("%g", d);
  100.  
  101. produce the same result. With character types,
  102.  
  103.   cout << 'a';
  104.  
  105. produces a, not 97.
  106.  
  107.  
  108.    Put functions
  109.  
  110. The member function
  111.  
  112.    ostream& ostream::put(char c);
  113.  
  114. writes the character c to an ostream as a character.
  115.  
  116.  
  117.         Built-in
  118.       formatting
  119.        functions
  120.  
  121. The following functions are defined in stream.h to aid in output
  122. formatting. Each of these functions returns a pointer to a string
  123. stored in a circular, or cyclical, static buffer. The buffer is
  124. large enough to support reasonable sequences of output conversions,
  125.  
  126. Page 2
  127.  
  128. but the pointers returned should not be saved for later use--the
  129. characters they point to may change in the meantime.
  130.  
  131.  
  132.          Numeric
  133.       conversion
  134.  
  135. Here are the three numeric conversion functions:
  136.  
  137.   char * dec(long val, int width = 0);
  138.  
  139.   char * hex(long val, int width = 0);
  140.  
  141.   char * oct(long val, int width = 0);
  142.  
  143. Each of these functions takes an integral value val and returns a
  144. pointer to a string corresponding to its decimal, hexadecimal, or
  145. octal representation. The optional width parameter specifies the
  146. number of characters in the returned string. If you omit this pa-
  147. rameter or set it to zero, the exact number of characters required
  148. will be used. Otherwise the string will be truncated on the right
  149. or blank-filled on the left as needed.
  150.  
  151. Note that each of the statements
  152.  
  153.   cout << i;
  154.   cout << dec(i);
  155.   cout << dec(i, 0);
  156.  
  157. produce identical results.
  158.  
  159.  
  160. ANSI C equivalent
  161.  
  162. The numeric conversion routines have equivalents in ANSI C. For
  163. example, the C++ statement
  164.  
  165.    cout << dec(val, width);
  166.  
  167. is equivalent to the ANSI C statement
  168.  
  169.   (width==0 ?
  170.      printf("%ld", (long) val) :    /* convert to natural length */
  171.      (sprintf(t, "%ld", (long) val),     /* else convert and */
  172.      printf("%*.*s, width, width, t)));  /* possibly truncate */
  173.  
  174. where t is a temporary character array. C++ does not strictly
  175. follow the ANSI printf conventions. In particular, passing a
  176. negative value for width is the same as passing 0, unlike printf,
  177. which takes a negative width value with * as a left-justify flag
  178. (-), followed by a positive width.
  179.  
  180. Page 3
  181.  
  182. The hex and oct routines have similar equivalents, using the printf
  183. %lx and %lo conversions, respectively.
  184.  
  185.  
  186. Character string
  187.       conversion
  188.  
  189. Here are the two character string conversion functions:
  190.  
  191.   char * chr(int ch, int width = 0);
  192.   char * str(const char *s, int width = 0);
  193.  
  194. Function chr returns a pointer to a string version of the input
  195. character value. Function str takes a string pointer and returns a
  196. string pointer. For both functions, the optional width parameter
  197. specifies the number of characters in the returned string. If this
  198. parameter is omitted or is zero, the exact number of characters
  199. required will be used. Otherwise the string will be truncated on
  200. the right or blank-filled on the left as needed.
  201.  
  202. For example, the expressions
  203.  
  204.   chr(0)
  205.   str("")
  206.  
  207. are equivalent, and each returns an empty string.
  208.  
  209. Function chr is the third way to print a character as a character.
  210. The previous example using the put function (on page 2) could also
  211. be written as
  212.  
  213.    cout << int('A') << " represents " << chr('A');
  214.  
  215. again resulting in "65 represents A".
  216.  
  217. Function str called with no width parameter (or with a 0 width)
  218. returns a copy of the input string, but one with an undependable
  219. lifetime. If it is called with width greater than 0, it returns a
  220. string of the specified size, appropriately truncated or blank-
  221. padded.
  222.  
  223.  
  224. C equivalent
  225.  
  226. These string conversion routines have equivalents in C. The
  227. following pairs of expressions are equivalent.
  228.  
  229. Page 4
  230.  
  231. ___________________________________________________________________
  232.  
  233.   C++                       C
  234. ___________________________________________________________________
  235.  
  236.   cout << chr(ch, width);   (width==0 ?
  237.                               printf("%c", ch) :
  238.                               printf("%*c", width, ch));
  239.  
  240.  
  241.   cout << str(s, width);    (width==0 ?
  242.                               (void) printf("%s", s) :
  243.                               (void) printf("%*.*s",
  244.                                             width, width, s));
  245. ___________________________________________________________________
  246.  
  247.  
  248.          General
  249.       Formatting
  250.  
  251. This function provides general formatting:
  252.  
  253.    char * form (char * format ...);
  254.  
  255. As with the other conversion functions, it returns a pointer to a
  256. static area which could be overwritten at a later time.
  257.  
  258. ANSI C equivalent
  259.  
  260. The form function is essentially the same as the ANSI C sprintf
  261. function. The two differences are in the calling sequence.
  262.  
  263. 1. The first argument of sprintf is a pointer to a character vector
  264.    to be written; form omits this argument and uses a static circu-
  265.    lar buffer instead.
  266.  
  267. 2. sprintf returns the number of characters written; form returns a
  268.    pointer to the output character vector.
  269.  
  270. The form function can thus be used as part of an output specifica-
  271. tion where the basic formatting is not adequate. For example:
  272.  
  273.    cout << "pi = " << form ("%1.10f", pi); // show 10 decimal
  274. places
  275.  
  276. The format string and additional parameters (if any) to form are
  277. identical to those of sprintf. A C++ expression like
  278.  
  279.    form (format, params)
  280.  
  281. is equivalent to the ANSI C expression
  282.  
  283.    (sprintf(s, format, params), s)
  284.  
  285. Page 5
  286.  
  287. where s is a static character vector. Refer to the definition of
  288. sprintf in the Reference Guide for further details.
  289.  
  290.  
  291.     User-defined
  292.            types
  293.  
  294. You can write your own output functions for your own defined types
  295. simply by further overloading the << operator. For example, suppose
  296. you have a type
  297.  
  298.   typedef struct {
  299.      char *name;
  300.      double val;
  301.      char *units;
  302.   } info;
  303.  
  304. You could then define a function
  305.  
  306.   ostream& operator << (ostream& s, info& m)
  307.   {
  308.      s << m.name << " = " << m.val << " " << m.units;
  309.      return s;
  310.   }
  311.  
  312. Then a simple reference such as
  313.  
  314.    cout << m;
  315.  
  316. would produce output like "capacity = 1.25 liters".
  317.  
  318.  
  319. Input
  320.  
  321. Stream input is accomplished via the >> (get from) operator, which
  322. is overloaded for stream input. Its left operand is an object whose
  323. type is class istream. Its right operand is any type for which
  324. stream input has been defined. Stream input is predefined for
  325. built-in types.
  326.  
  327. The >> input operator skips whitespace (as defined by the isspace
  328. function in ctype.h), then reads in characters appropriate to the
  329. type of the input object. (Actually, whitespace skipping can be
  330. turned off; this is described below.)
  331.  
  332. The >> operator binds left to right and returns its left operand,
  333. so that several input operations can be combined in one statement.
  334. For example, consider
  335.  
  336.   int i;
  337.   double d;
  338.   cin >> i >> d;
  339.  
  340. Page 6
  341.  
  342. This statement will cause whitespace to be skipped, digits read in
  343. and converted to internal binary form and saved in variable i, more
  344. whitespace to be skipped, and finally a floating-point number read
  345. in and saved in variable d.
  346.  
  347.  
  348.   Built-in types
  349.  
  350. For types short, int, and long, the effect of operator >> is to
  351. skip whitespace and convert an integral value, reading input char-
  352. acters until one is found which cannot be part of the representa-
  353. tion of the type. The format of integral values recognized is the
  354. same as that of integer constants in C++, excluding integer
  355. suffixes. That is, a leading 0x or 0X denotes hexadecimal
  356. representation, a leading 0 not followed by x or X denotes octal
  357. representation, and a leading 1 through 9 denotes decimal
  358. representation. A trailing l, L, u, or U is not part of the value
  359. and is not removed from the input stream.
  360.  
  361. For types float and double, the effect of operator >> is to skip
  362. whitespace and convert a floating-point value, reading input
  363. characters until one is found which cannot be part of a floating-
  364. point representation. The format of floating-point values recog-
  365. nized is the same as that of floating-point constants in C++,
  366. excluding floating suffixes. That is, a trailing f, F, l, or L is
  367. not part of the value and is not removed from the input stream.
  368.  
  369. For all numeric types, if the first non-whitespace character is not
  370. a sign or digit (or decimal point for floating-point conversion),
  371. the stream enters the _fail state (described on page 18) and no
  372. further input will be done until the condition is cleared.
  373.  
  374. For type char, the effect of operator >> is to skip whitespace and
  375. store the next (non-whitespace) character.
  376.  
  377. For type char * (treated as a string), the effect of operator >> is
  378. to skip whitespace and store the next (non-whitespace) characters
  379. until another whitespace character is found.
  380.  
  381. In all cases, if end of input occurs before any non-whitespace
  382. character is found, nothing is stored in the target object. That
  383. is, if the target was uninitialized, it will still be
  384. uninitialized.
  385.  
  386.  
  387.      Controlling
  388.       whitespace
  389.  
  390. A whitespace character is one for which function isspace (in
  391. ctype.h) returns a nonzero value. These are presently the blank
  392. (' '), tab (\t), carriage-return (\r), newline (\n), formfeed (\f),
  393. and vertical tab (\v).
  394.  
  395. Page 7
  396.  
  397. A standard object called WS of type struct whitespace is predefined
  398. as a "sink" for (place to discard) whitespace characters. For
  399. example,
  400.  
  401.    cin >> WS;
  402.  
  403. will skip consecutive whitespace characters from the standard
  404. input. The next character input will not be whitespace. This is
  405. useful in routines reading user-defined types in conjunction with
  406. one of the get member functions, or when skipping is turned off. We
  407. discuss this in more detail later.
  408.  
  409.  
  410.    Get functions
  411.  
  412. As noted above, the >> operator for built-in types reads and
  413. discards whitespace. The two get member functions in class istream
  414. provide a way to read and process whitespace characters.
  415.  
  416. 1. istream& istream::get (char& c);
  417.  
  418.    This function reads the next character, whatever it is, into its
  419.    parameter.
  420.  
  421. 2. istream& istream::get (char *buf, int max, int term='\n');
  422.  
  423.    This function reads characters from the input stream into the
  424.    character vector pointed to by buf until max characters have
  425.    been read, or until the character term has been encountered,
  426.    whichever comes first. The default termination character (which
  427.    need not be specified) is the newline. The termination character
  428.    is not part of the characters read, and is not removed from the
  429.    input stream. The character vector buf must be larger than max,
  430.    since it must also hold the terminating null.
  431.  
  432.    If we simply use s >> p instead, we would not be able to control
  433.    the number of characters read nor the termination character.
  434.  
  435. These are member functions, and so must be called in relation to
  436. the input stream they are to read. See the example in the next
  437. section.
  438.  
  439.  
  440.          Putback
  441.       (function)
  442.  
  443. The member function
  444.  
  445.    void istream::putback(char c);
  446.  
  447. Page 8
  448.  
  449. pushes back one character into the input stream. putback pushes
  450. back one (and only one) character onto the input stream; extras are
  451. silently ignored. You cannot push back EOF.
  452.  
  453. Here is a simple routine which reads a C++ style identifier.
  454.  
  455.   void getident (char *s /* where to put ident */)
  456.   {
  457.      char c = 0;                     // guard against EOF
  458.  
  459.      cin >> c;                       // skips leading whitespace
  460.      if (isalpha(c)  ||  c == '_')
  461.          do {
  462.             *s++ = c;
  463.             c = 0;                   // guard against EOF
  464.             cin.get(c);
  465.          } while (isalnum(c) ||  c == '_');
  466.      *s = 0;                         // terminate the string
  467.      if (c)
  468.         cin.putback(c);              // we always get one too many
  469.   }
  470.  
  471.  
  472.      Controlling
  473.       whitespace
  474.         skipping
  475.  
  476. Input streams skip whitespace by default. However, you can
  477. initialize an input stream to not skip whitespace. In addition, you
  478. can turn the skipping on and off via the member function
  479.  
  480.    int istream::skip (int doskip);
  481.  
  482. This function turns off the whitespace skipping state if parameter
  483. doskip is zero, and turns it on otherwise. It returns the previous
  484. skipping state.
  485.  
  486. When whitespace skipping is off, default input to the numeric,
  487. character, and string types will fail if the next input character
  488. is whitespace. Sending input to the WS object will discard
  489. whitespace.
  490.  
  491. For example, suppose you want special processing for fields which
  492. are separated by nonblank whitespace, such as tabs and newlines,
  493. and normal processing for fields separated by blank characters.
  494.  
  495.   char string[MAX], c;
  496.   int old_skip = cin.skip(0);     // skipping off
  497.   while (cin.good()) {
  498.      do {
  499.       cin.get(c);
  500.  
  501. Page 9
  502.  
  503.      }  while (c == ' ');        // skip blank characters
  504.      if (isspace(c))
  505.         special();                // nonblank whitespace
  506.      else {
  507.         cin.putback(c);           // replace printable character
  508.         cin >> string;            // get field and process
  509.         process(string);
  510.      }
  511.   }
  512.   cin.skip(old_skip);             // restore old skip state
  513.  
  514.  
  515.     User-defined
  516.            types
  517.  
  518. You can write your own input functions for your own defined types
  519. in the same way as for output functions. Here is a simple example
  520. with no error checking to read in type info defined above.
  521.  
  522.   istream& operator >> (istream& s, info& m)
  523.   {
  524.      s >> m.name >> m.val >> m.units;
  525.      return s;
  526.   }
  527.  
  528. An input line of text like "capacity 1.25 liters" can then be read
  529. with a simple reference like
  530.  
  531.    cin >> m;
  532.  
  533.  
  534.     Initializing
  535.          streams
  536.  
  537. The streams cin, cout, and cerr are initialized and open at program
  538. start, and are connected to, respectively, the standard input,
  539. standard output, and standard error files.
  540.  
  541. Initializing (constructing) a stream means associating it with a
  542. stream buffer. We discuss input and output streams separately.
  543.  
  544.  
  545.   Output streams
  546.  
  547. Class ostream provides these three constructors.
  548.  
  549. 1. ostream::ostream (streambuf *s);
  550.  
  551.    This associates a named output stream with a stream buffer
  552.    (class streambuf or its derived classes, such as class filebuf).
  553.  
  554. Page 10
  555.  
  556. 2. ostream::ostream (int fd);
  557.  
  558.    This associates a named output stream with a file already
  559.    opened, and assigns a stream buffer to it. The normal use for
  560.    this is first to open a file as described below, and then imme-
  561.    diately to initialize a stream associated with it.
  562.  
  563. 3. ostream::ostream (int size, char *buf);
  564.  
  565.    This associates a named output stream with a character vector.
  566.    All "output" to the stream will be written to the vector. This
  567.    is described below.
  568.  
  569. The destructor for class ostream
  570.  
  571.   ostream::~ostream()
  572.  
  573. flushes the output stream via the member function
  574.  
  575.   ostream::flush()
  576.  
  577. You can also call this member function explicitly if you want, as
  578. in this example:
  579.  
  580.    cout << stuff; cout.flush();
  581.  
  582.  
  583.    Input streams
  584.  
  585. Class istream provides these three constructors.
  586.  
  587. 1. istream::istream (streambuf *s, int skip = 1, ostream *t = 0);
  588.  
  589.    This associates a named input stream with a stream buffer (class
  590.    streambuf).
  591.  
  592.    Optional parameter skip specifies whether whitespace should be
  593.    skipped in input operations. The default is to skip.
  594.  
  595.    Optional parameter t specifies an output stream to which this
  596.    input stream should be "tied". When two streams are tied, the
  597.    output stream is always flushed before anything is read from the
  598.    input stream. Standard streams cin and cout are tied.
  599.  
  600. 2. istream::istream (int fd, int skip = 1, ostream *t = 0);
  601.  
  602.    This associates a named input stream with a file already opened,
  603.    and assigns a stream buffer to it. The normal use for this is
  604.    first to open a file as described below, and then immediately to
  605.    initialize a stream associated with it.
  606.  
  607.    The optional skip and t parameters are as described above.
  608.  
  609. Page 11
  610.  
  611. 3. istream::istream (int size, char *buf, int skip = 1);
  612.  
  613.    This associates a named input stream with a character vector.
  614.    All "input" from the stream will be read from the vector, as
  615.    described below.
  616.  
  617.    The optional skip parameter is as described above.
  618.  
  619. Class istream includes member function
  620.  
  621.    ostream * istream::tie (ostream *to);
  622.  
  623. Calling tie with the address of an output stream ties these two
  624. streams together. Only one output stream may be tied to an input
  625. stream. Calling tie again with a different output stream breaks the
  626. previous tie and establishes a new one. Calling tie again with the
  627. same output stream has no effect. Calling tie with an argument of
  628. zero breaks the tie and associates no output stream with the input
  629. stream.
  630.  
  631. Function tie returns the output stream previously associated, or
  632. zero if there was none. For example, cin and cout are tied by
  633. default. The statement
  634.  
  635.    ostream *old_tie = cin.tie(0);
  636.  
  637. breaks the tie and allows asynchronous input and output with cin
  638. and, presumably, cout. The statement
  639.  
  640.    cin.tie(old_tie);
  641.  
  642. re-establishes the previous tie (presumably to cout) and ensures
  643. that pending output is flushed before any input is requested from
  644. cin. If cin and cout are connected to the user's terminal, you
  645. would want them tied so that an output prompt would always appear
  646. on the terminal before input was attempted.
  647.  
  648.  
  649. File I/O
  650.  
  651. Apart from the files associated with standard streams cin, cout,
  652. and cerr, you can associate an external file with class filebuf,
  653. derived from class streambuf. Once you do this, you can associate
  654. this file buffer with a stream to accomplish stream I/O on the
  655. file.
  656.  
  657. Class filebuf has these four constructors:
  658.  
  659. 1. filebuf::filebuf();
  660.  
  661.    This only allocates a file buffer, without yet tying it to an
  662.    external file.
  663.  
  664. Page 12
  665.  
  666. 2. filebuf::filebuf (FILE *f);
  667.  
  668.    This associates a file buffer with an ANSI C standard I/O file
  669.    already open. This allows you to mix C standard I/O with stream
  670.    I/O in the same program. In the present implementation, all file
  671.    I/O is done via C standard I/O; in fact, using filebuf::open()
  672.    creates a C standard I/O file.
  673.  
  674. 3. filebuf::filebuf (int fd);
  675.  
  676.    This associates a file buffer with a file already open, such as
  677.    via the library function open. If input or output has already
  678.    taken place on this file, it is not guaranteed that further I/O
  679.    will work as desired. Stream I/O can't be mixed with low-level
  680.    read and write functions in particular.
  681.  
  682. 4. filebuf::filebuf (int fd, char *buf, size len);
  683.  
  684.    As above, this associates a file buffer with a file already
  685.    open. It further uses the supplied buffer specified by buf and
  686.    len for any file buffering, rather than allocating its own
  687.    buffer.
  688.  
  689. The class destructor, filebuf::~filebuf(), invokes member function
  690. close, described below. Class filebuf includes the following five
  691. public member functions:
  692.  
  693. 1. filebuf * filebuf::open (char *name, open_mode om);
  694.  
  695.    This member function opens a named file according to enumerated
  696.    type open_mode. It returns a pointer to the filebuf on success,
  697.    or zero on error.
  698.  
  699.    Type open_mode is defined by enumerated type open_mode as
  700.    follows:
  701.  
  702.      enum open_mode { input, output, append };
  703.  
  704.    Mode append is for extending an existing output file. There is
  705.    no way to open a stream for both input and output (update mode).
  706.  
  707. 2. int filebuf::close();
  708.  
  709.    This member function closes the associated file and does any
  710.    other housekeeping actions required. It returns zero if the file
  711.    was closed successfully, and nonzero otherwise.
  712.  
  713. 3. virtual int filebuf::snextc();
  714.  
  715.    This gets and returns the next character from the input stream
  716.    buffer, or returns EOF on end of input.
  717.  
  718. Page 13
  719.  
  720. 4. virtual int filebuf::sputc (int c);
  721.  
  722.    This writes c, converted to a char, to the output stream buffer.
  723.    It returns C if successful, EOF on error.
  724.  
  725. 5. virtual void filebuf::sputbackc(char c);
  726.  
  727.    This pushes back one character into the (input) stream buffer.
  728.    You can always push back at least one character before reading a
  729.    character again. If you try to push back too many characters,
  730.    the extras are silently ignored. You cannot push back EOF. (That
  731.    is, the attempt to push back EOF is ignored.)
  732.  
  733. Associating a named file with a stream normally follows a sequence
  734. such as this:
  735.  
  736.   #include <stream.h>
  737.   filebuf inf;
  738.   if (inf.open(name, input) == 0) {
  739.      ...error condition: exit
  740.   }
  741.   istream indata(&inf);
  742.  
  743.   filebuf outf;
  744.   if (outf.open(name, output) == 0) {
  745.      ...error condition: exit
  746.   }
  747.   ostream outdata(&outf);
  748.  
  749. If, for example, the input file were already open, we could replace
  750. the first part of the code with
  751.  
  752.   extern int fd;
  753.   filebuf inf(fd);
  754.   istream indata(&inf);
  755.  
  756. Be sure to call open to set up fd. Don't confuse open and
  757. filebuf::open.
  758. Or even more simply:
  759.  
  760.   extern int fd;
  761.   istream(fd);
  762.  
  763. which includes allocating the file buffer.
  764.  
  765. Alternatively, we could open either file as a C standard I/O file.
  766.  
  767.   FILE *f;
  768.   if ((f = fopen(name, "r")) == 0) {
  769.      ...error condition: exit
  770.   }
  771.   filebuf inf(f);
  772.  
  773. Page 14
  774.  
  775.   istream indata(&inf);
  776.  
  777. Finally, suppose a file has already been opened for C standard I/
  778.  O. We can associate a stream buffer with it like this:
  779.  
  780.   extern FILE *f;
  781.   filebuf inf(f);
  782.   istream indata(&inf);
  783.  
  784.  
  785. Buffering streams
  786.  
  787. Streams implement buffered text I/O. A stream is always associated
  788. with a stream buffer, which is an object of class streambuf. This
  789. class provides the basic buffering mechanisms independent of the
  790. kind of device which might be physically associated with the
  791. stream.
  792.  
  793. Class streambuf has the following two constructors:
  794.  
  795. 1. streambuf::streambuf();
  796.  
  797.    This only allocates a streambuf, with no buffer space reserved.
  798.  
  799. 2. streambuf::streambuf (char *buf, int len);
  800.  
  801.    This allocates a streambuf, using the given buffer address and
  802.    length. This is particularly useful for a stream attached to a
  803.    string.
  804.  
  805. Class streambuf has the following two protected member functions.
  806. These are available for use by derived classes, but not by ordinary
  807. user functions. (Notice that equivalent functions are provided by
  808. derived classes istream and ostream where appropriate.)
  809.  
  810. 1. int streambuf::allocate();
  811.  
  812.    This allocates a 512 byte buffer (via new) for use by this
  813.    stream if one has not already been allocated. It returns zero if
  814.    all is well, and EOF to indicate that no buffer could be
  815.    allocated. If this mechanism allocates a buffer, the buffer is
  816.    automatically deleted by the class destructor
  817.    streambuf::~streambuf().
  818.  
  819. 2. streambuf * streambuf::setbuf(char *buf, int len,
  820.    int offset = 0);
  821.  
  822.    This assigns a user-supplied buffer to the streambuf. Any
  823.    previously-assigned buffer is disassociated. If the previous
  824.    buffer had been assigned via the allocate mechanism, it is
  825.    deleted. The optional parameter offset specifies where the next
  826.    free byte in the buffer is located. This allows a full or
  827.  
  828. Page 15
  829.  
  830.    partially full buffer to be assigned to a streambuf, and is the
  831.    only way for a string to be usefully assigned to an input
  832.    stream. This member function always returns the streambuf.
  833.  
  834. The following three virtual functions are also protected:
  835.  
  836. 1. virtual int streambuf::overflow(int c = EOF);
  837.  
  838.    The derived class is responsible for providing a suitable
  839.    function for overflow. The overflow function should empty the
  840.    stream buffer, place c in the buffer, and return c, except
  841.    return EOF. This member function cannot empty a buffer (since
  842.    there is no place to put the data), so it just returns EOF.
  843.  
  844. 2. virtual int streambuf::underflow();
  845.  
  846.    The derived class is responsible for providing a suitable
  847.    function for underflow. This function always returns EOF.
  848.  
  849. 3. virtual void streambuf::terminate();
  850.  
  851.    This routine terminates the buffer with a null byte without
  852.    advancing the pointer.
  853.  
  854. The following three virtual functions are public.
  855.  
  856. 1. virtual int streambuf::snextc();
  857.  
  858.    This gets and returns the next character from an input stream
  859.    buffer, or EOF on end of input.
  860.  
  861. 2. virtual int streambuf::sputc (int c);
  862.  
  863.    This writes c, converted to a char, to an output stream buffer.
  864.    It returns c if ok, EOF on error.
  865.  
  866. 3. virtual void streambuf::sputbackc(char c);
  867.  
  868.    This pushes back one character into the (input) stream buffer.
  869.    You can always push back at least one character before reading a
  870.    character again. If you try to push back too many characters,
  871.    the extras are silently ignored. You cannot push back EOF.
  872.  
  873.  
  874. String I/O
  875.  
  876. You can tie an input or output stream to a character vector instead
  877. of a file. For input, the null byte terminating the string is taken
  878. as end of file. For output, the ostream mechanism knows how big the
  879. vector is, and will never write past the end.
  880.  
  881. Page 16
  882.  
  883. For input, an initializing part of a program can tie the input
  884. stream to standard input, to a file, or to a string, and the rest
  885. of the program simply does stream I/O without needing to know the
  886. source of the input.
  887.  
  888. For output, a string can be formatted by a hierarchy of routines
  889. which do not need to know whether they are writing to a file or to
  890. a string, and which do not need to keep track of the current end of
  891. the string or check for overflow.
  892.  
  893. In the following example, the main program can be invoked with a
  894. literal string to process (flagged by "-" as the first program
  895. parameter), with one or more file names to process, or with no
  896. arguments, signifying that standard input is to be processed.
  897.  
  898.   #include <stream.h>
  899.  
  900.   // function "process" deals only with input streams,
  901.   // regardless of the actual source
  902.   void process (istream&);
  903.  
  904.   main (int argc, char *argv[])
  905.   {
  906.      if (argc == 1) {
  907.         // no name given: use standard input
  908.         process(cin);
  909.      }
  910.      else if (argc == 3 && strcmp(argv[1], "-") == 0) {
  911.         // use the string
  912.         istream inp(strlen(argv[2]), argv[2]);
  913.         process(inp);
  914.      }
  915.      else {
  916.         for (int i = 1;  i < argc;  ++i) {
  917.            // process each file name
  918.            filebuf f; // new filebuf each iteration
  919.            if (f.open(argv[i], input) == 0) {
  920.               cerr << "Can't open " << argv[i] << '\n';
  921.            }
  922.            else {
  923.               istream inp(&f); // new istream each iteration
  924.               process(inp);
  925.            }
  926.            // automatically close and destruct at end of each
  927.   iteration
  928.         }
  929.      }
  930.   }
  931.  
  932. Page 17
  933.  
  934. Stream states
  935.  
  936. Each istream and ostream has a "state" associated with it, along
  937. with public member functions to read and change the state. The
  938. state is defined by enumerated type stream_state as follows:
  939.  
  940.    enum stream_state { _good, _eof, _fail, _bad };
  941.  
  942. Don't rely on any particular numerical values for these state
  943. names.
  944.  
  945. State _good means that the last I/O operation succeeded, and the
  946. next one might succeed. State _eof means that no more input is
  947. available from an input stream. State _fail means that the last
  948. operation failed, and no further operations will succeed (no I/O
  949. will be attempted once the _fail state is reached). State _bad
  950. means that not only is the stream in a failed state, but that the
  951. stream has been corrupted, meaning characters were lost.
  952.  
  953. The following five member functions are defined for both class
  954. istream and ostream for testing the state:
  955.  
  956. 1. enum stream_state rdstate();   // return the state
  957.  
  958. 2. int eof();                     // return nonzero if _eof
  959.  
  960. 3. int fail();                    // return nonzero if _failed or
  961.    _bad
  962.  
  963. 4. int bad();                    // return nonzero if _bad
  964.  
  965. 5. int good();                   // return nonzero if _good
  966.  
  967. The following member function can be used to set the state of a
  968. stream. The default is to set the state to _good. Obviously, you
  969. should use this function with care.
  970.  
  971.    void clear (enum stream_state val = _good);
  972.  
  973. Finally, you can test a stream itself, with a nonzero return only
  974. if the state is _good. This allows loops like
  975.  
  976.   // process each item in file
  977.   while (cin >> val)
  978.      process(val);
  979.  
  980. or
  981.  
  982.   // copy file, stripping all whitespace
  983.   char str[BIG_ARRAY];
  984.   while (cin >> str)
  985.      if (! (cout << str))
  986.         break;               // error in output
  987.  
  988. Page 18
  989. ___________________________________________________________________
  990.  
  991. INDEX
  992.  
  993. >> (get from) operator                input 6-12
  994.   concatenation 6                       data types supported 7
  995.   overloading                           user-defined 10
  996.     user-defined types and 10         member functions
  997. << (put to) operator                    pushing characters into
  998.   concatenation 1                       input stream 8
  999.   overloading                           put 2
  1000.     user-defined types and 6            putback 8
  1001. << operator                             skip 9
  1002.   streams and 1                       numbers
  1003. >> operator                             converting
  1004.   streams and 6                           ANSI C and 3
  1005.                                         converting and conversions
  1006.                                         3
  1007. A                                         C++ 3
  1008. allocate (member function) 15         operators
  1009. ANSI                                    >> (get from)
  1010.   C standard                              overloading 10
  1011.     C++ numeric conversion                streams and 6
  1012.     routines and 3                      << (put to)
  1013.     C++ string conversion                 concatenation 1
  1014.     routines and 4                        overloading 6
  1015. ASCII codes                               streams and 1
  1016.   printing as characters              operators (get from)
  1017.     C++ 2                               >>
  1018.                                           concatenation 6
  1019.                                       output 1-6
  1020. C                                       data types supported 2
  1021. C++                                     formatting 2
  1022.   characters                            user-defined 6
  1023.     converting 4                      streams
  1024.       C and 4                           << operator and 1
  1025.   concatenation                         >> operator and 6
  1026.     << (get from) operator 1            buffering 15-16
  1027.     >> (put to) operator 6              cout
  1028.   constructors                            printf and 2
  1029.     filebuf 12                          initializing 10-12
  1030.     istream and ostream 10, 11          using 1-19
  1031.     streambuf 15                      strings
  1032.   destructors                           converting 4
  1033.     ~filebuf 13                           C and 4
  1034.   files                                 input and output 16-17
  1035.     input and output 12-15            whitespace in
  1036.   identifiers                           controlling 7
  1037.     reading 9
  1038.  
  1039. Page 19
  1040.  
  1041. characters                          D
  1042.   converting                        data types
  1043.     C++ 4                             C++
  1044.   input                                 input and 7
  1045.     C++ 7, 8                            output and 2
  1046.   output
  1047.     C++ 2
  1048.   pushing onto C++ input stream     F
  1049.     8                               floating point
  1050. classes                               input
  1051.   filebuf                               C++ 7
  1052.     close member function 13          output
  1053.     constructors 12                     C++ 2
  1054.     destructor 13                   form (function)
  1055.     open member function 13           sprintf and 5
  1056.     snextc member function 13       format specifiers
  1057.     sputbackc member function         C++ and 2
  1058.     14                              formatting
  1059.     sputc member function 14          C++
  1060.   istream and ostream                   form function and 5
  1061.     constructors 10, 11                 output 2
  1062.     member functions 18
  1063.     states 18
  1064.     tie member function 12          I
  1065.   streambuf 15                      integers
  1066.     allocate member function 15       input
  1067.     constructors 15                     C++ 7
  1068.     overflow member function 16       output
  1069.     setbuf member function 15           C++ 2
  1070.     snextc virtual member
  1071.     function 16
  1072.     sputbackc virtual member        O
  1073.     function 16                     open (member function) 13
  1074.     sputc virtual member            overflow
  1075.     function 16                       member function 16
  1076.     terminate virtual member
  1077.     functions 16
  1078.     underflow virtual member        P
  1079.     functions 16                    printf (function)
  1080. close (member function) 13            cout and 2
  1081. conversions                         putback (member function) 8
  1082.   C++ 3
  1083.     ASCII code to characters 2
  1084.   character                         S
  1085.     C++ 4                           setbuf (member function) 15
  1086.   numeric                           skip (member function) 9
  1087.     C++ 3                           snextc (member function) 13, 16
  1088.   strings                           sprintf (function)
  1089.     C++ 4                             form function and 5
  1090.                                     sputbackc (member function) 14,
  1091.                                       16
  1092.                                     sputc (member function) 14, 16
  1093.  
  1094. Page 20
  1095.  
  1096. strings                             U
  1097.   converting                        underflow
  1098.     C++ 4                             member function 16
  1099.  
  1100.  
  1101. T                                   W
  1102. terminate (member function) 16      whitespace
  1103. tie (member function) 12              C++ and 7
  1104.                                         skipping 9
  1105.  
  1106. Page 21
  1107.  
  1108.