Janne Blomqvist wrote:
> On 2008-05-12, glen herrmannsfeldt <gah@[EMAIL PROTECTED]
> wrote:
>>The C/unix tradition is that terminal output (either stderr, or
>>stdout not redirected to a file) is unbuffered. The output will
>>appear immediately without the need for fflush(). When going
>>to a file or even a pipe it is buffered and normally doesn't appear
>>immediately.
> From the latest(?) ISO C draft (n1256.pdf), page 267:
> At program startup, three text streams are predefined and need not be
> opened explicitly - standard input (for reading conventional input),
> standard output (for writing conventional output), and standard error
> (for writing diagnostic output). As initially opened, the standard
> error stream is not fully buffered; the standard input and standard
> output streams are fully buffered if and only if the stream can be
> determined not to refer to an interactive device.
> Additionally, C has the concept of "line buffered", meaning that the
> buffer is flushed when a newline is written. AFAIK stdout and stdin,
> when connected to a terminal (as they usually are unless they have
> been redirected), are typically line buffered, whereas stderr is
> unbuffered.
I wrote C/unix, as it is a little hard to determine which
parts are C related and which unix. A C implementation on
a system with line buffered terminals would have a hard time
following that rule. Also, the C rules are meant to allow
for record oriented file systems like some IBM descendants
of OS/360 use.
>>I believe there is some historical connection between
>>ADVANCE="NO" and C stream output. I am pretty sure the
>>Fortran standard doesn't require unbuffered (in the unix
>>sense) output, but it might be considered
>>a "quality of implementation" issue.
> Well, C has no concept of records, so advance='no' doesn't
> really fit into that model.
The comments about "line buffering" are, I believe, meant to
allow for systems that do use records. (For text files.)
C defaults to text mode, using "binary mode" when a "b"
is included in the fopen() call.
> However, access='stream' is quite close to the C
> model (though for formatted I/O the distinction between sequential and
> stream goes into somewhat arcane details), and advance='no' provides a
> way to suppress the trailing newline after a read/write statement.
Maybe the OP should try access="stream".
-- glen


|