Click on the banner to return to the user guide home page.

©Copyright 1996 Rogue Wave Software

Simple Example

Here's a simple example that exercises RWbostream and RWbistream through their respective abstract base classes, RWvostream and RWvistream:

#include <rw/bstream.h>
#include <rw/cstring.h>
#include <fstream.h>

#ifdef __BORLANDC__
# define MODE ios::binary                                    // 1
#else
# define MODE 0
#endif

void save(const RWCString& a, RWvostream& v){
  v << a;                    // Save to the virtual output stream
}

RWCString recover(RWvistream& v) {
   RWCString dupe;
   v >> dupe;            // Restore from the virtual input stream
   return dupe;
}

main(){
   RWCString a("A string with\ttabs and a\nnewline.");

   {
     ofstream f("junk.dat", ios::out|MODE);                  // 2
     RWbostream bostr(f);                                    // 3
     save(a, bostr);
   }                                                         // 4

   ifstream f("junk.dat", ios::in|MODE);                     // 5
   RWbistream bistr(f);                                      // 6
   RWCString b = recover(bistr);                             // 7

   cout << a << endl;  // Compare the two strings            // 8
   cout << b << endl;
   return 0;
}

Program Output:

A string with   tabs and a
newline.
A string with   tabs and a
newline.

The job of function save(const RWCString& a, RWvostream& v) is to save the string a to the virtual output stream v. Function recover(RWvistream&) restores the results. These functions do not know the ultimate format with which the string will be stored. Here are some additional comments on particular lines:

//1, //2 On these lines, a file output stream f is created for the file junk.dat. The default file open mode for many PC compilers is text, requiring that the explicit flag ios::binary be used to avoid automatic DOS new line conversion[6].
//3 On this line, an RWbostream is created from f.
//4 Because this clause is enclosed in braces { ... }, the destructor for f will be called here. This will cause the file to be closed.
//5 The file is reopened, this time for input.
//6 Now an RWbistream is created from it.
//7 The string is recovered from the file.
//8 Finally, both the original and recovered strings are printed for comparison.

You could simplify this program by using class fstream, which multiply inherits ofstream and ifstream, for both output and input. A seek to beginning-of-file would occur before reading the results back in. Since some early implementations of seekg() have not proven reliable, the simpler approach was not chosen for this example.