Example 1. This simple program creates a new file and writes a string to it.
#include <pstreams.h>
USING_PTYPES
int main()
{
// the outfile object is declared and constructed outside
// the try...catch clause, since the exception object
// contains a reference to the stream that caused the error.
// besides, stream constructors and destructors in PTypes
// never throw exceptions.
outfile f(fname);
f.set_bufsize(1024); // the default value in this version is 8192
try
{
f.open();
f.put("This is a test file.");
f.close();
}
catch (estream* e)
{
perr.putf("File error: %s\n", e->get_message());
delete e;
}
return 0;
}
Example 2. This program reads a C source, extracts identifiers and builds a usage dictionary. It does not understand C comments and string literals though, but can be easily improved to understand them too.
#include <ptypes.h>
#include <pstreams.h>
USING_PTYPES
const cset letters("_A-Za-z");
const cset digits("0-9");
const cset identchars = letters + digits;
const cset otherchars = !letters;
void main(int argc, char* argv[])
{
tstrlist<void*> dic(SL_SORTED | SL_CASESENS);
infile f(argv[1]);
try
{
f.open();
while (!f.get_eof())
{
char c = f.preview();
// a C identifier begins with a letter
if (c & letters)
{
// ... and may contain letters and digits
string ident = f.token(identchars);
int i;
if (!dic.search(ident, i))
dic.ins(i, ident, 0);
}
else
// ignore everything else
f.skiptoken(otherchars);
}
}
catch (estream* e)
{
pout.putf("Error: %s\n", e->get_message());
delete e;
}
// now print the dictionary
for (int i = 0; i < dic.get_count(); i++)
pout.putline(dic.getkey(i));
}
See also: iobase, instm, infile, outstm, outfile, Error handling