Re: Flushing the output buffer after writing to stdout?

al davis <[email protected]>
Newsgroups gmane.comp.gnu.gnucap.devel
Message-ID <[email protected]>
On Sunday 16 April 2006 16:22, Stuart Brorson wrote:
> I'd like to talk to gnucap via a pipe opened from another process.  In
> particular, I am using the "popen2" facility from Python.  So
> far, my efforts in this direction have failed.  I suspect that one of
> my problems is that the IO buffers aren't being flushed
> after gnucap outputs a bunch of text to the stdout.

The buffers are automatically flushed on every \n, \r, \b.

> I have looked through the gnucap code to try to explicitly stick calls
> to flush at the critical places where IO occurs.  However, I am
> completely flummoxed by how gnucap does IO.  I have discovered the IO
> class as well as the OMSTREAM class, but can't figure out how these
> inherit from cout, which is the only thing I know about C++ IO.  I
> also don't know the difference between IO and OMSTREAM, or what they
> are trying to accomplish.

The use of OMSTREAM is sort of like any stream, but it is a multiple stream.  
Think of it as a set of streams.  Writing once writes to all of them.

This part of the code was written many years ago, before C++ I/O was stable, 
so it is built around the old C "FILE*".  Even now, it does some things that 
the usual C++ streams don't, such as floating point numbers with letters 
representing multipliers, better control of formatting, including support for 
devices and files with limited line length.  The files included in a single 
OMSTREAM are not necessarily formatted the same.  Still, writing once does 
them all.

Basically, you open a C style FILE*, then attach it.

If you look inside, you will see that the C++ streams do this too.

>
> Questions:
>
> 1.  Within gnucap, which statement actually writes something to the
> stdout?

Usually "fputc", but please don't use it directly.

> 2.  How do I explicitly tell stdout to flush?  Has this fcn been built
> into the relevant classes yet?

Writing \n, \r, or \b.  Doing it as part of a string has the desired effect.  
If you want to flush in the middle of a line, write a blank then backspace.

Since it uses the standard C I/O, which links stdin and stdout, reading from 
stdin flushes stdout.

> 3.  Ummm, can somebody please give me the 30 second overview of what
> IO and OMSTREAM classes are for, and how one should use them?

ALL output uses OMSTREAM.

The IO class should really be a namespace.  It is a class only because there 
was no such thing as namespace when I wrote that part.  It exists for the 
purpose of minimizing clutter in the global namespace.  Actually, it probably 
should be more like a regular class, a container for all IO stuff.  That way 
there could be more than one.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.