Somewhat belated rely as I have been on vacation for 3 weeks. I see
that others have addressed most of the comments I would have made. I
have just a few additional side comments.
On Jul 6, 2005, at 1:23 PM, Clive Page wrote:
> I had not appreciated the substantial differences between formatted
> and unformatted stream I/O, and had only looked properly at the
> sections of the Standard describing the former.
Ouch! Then no wonder you were confused. They are indeed very different.
Furthermore, unformatted is *FAR* simpler. If you had to concentrate
only on one of them I'd sure recommend looking at unformatted instead
of formatted.
In fact, my original proposal for stream I/O didn't include formatted
because I was trying to keep things simple. Formatted streams are
substantially more complicated and yet don't add anything that I regard
as critically new, so I figured that omitting them would help the
cost/benefit tradeoff. But the gist of the responses to my proposal was
that "everyone" liked the idea, but many people also wanted formatted
capability, so it got added. Almost all of the subsequent work on the
subject was on formatted... because it had all the complications that
needed work. At times I wish I had resisted the request to add
formatted....
In regards to the differences:
A formatted stream file is really the same thing as a sequential text
file. It is perhaps a bit of a misnomer to refer to it as a kind of
file at all (but the standard does and that's probably my fault at
least in part). It is a different way to access the same kind of file.
The form of access is more convenient in some situations, but I don't
personally regard formatted streams as a critical new feature.
In particular, a formatted stream file *IS* also a record file. It
comes complete with all the properties that record files have - whether
you choose to call these "shackles" on not. I personally happen to
think of record files as a case of the operating system providing
important additional support that would otherwise have to be done by
the user. I don't view the fact that most current operating systems
omit record management support to be an improvement. But I digress... I
think that many of the restrictions and oddities of formatted stream
access can be best understood through recognizing that this really is a
record file.
In that regard, I have not time to do a detailed review of the web page
you wrote up, but I found one point in it to be seriously misleading.
No, formatted stream files (aka formatted sequential files) do *NOT*
have the structure of a line of text followed by a delimiter. If you
try to think of that as their basic definition, then you will probably
get confused by many things. Their structure is just a line of text in
a record. The record is defined by the processor (compiler). In that
regard, they are just as system-dependent as unformatted files. It just
happens that essentially all systems define and support a suitable text
file structure, which Fortran implementations naturally use. (The
Fortran standard doesn't require that Fortran sequential formatted
files be compatible with such things as text editors or anything else
on the system, but the market does require it).
With formatted stream access, the newline character is used in the
output data to *REPRESENT* the end of a record. This does not in any
way imply that records are actually stored in such a manner. If I
recall correctly, the same is true of C. The possible translations
between this representation and the actual file structure relate to
some of the restrictions.
Unformatted streams provide capability that is fundamentally new and
was really *VERY* painful to do portably and within the context of
previous Fortran standards. Trust me on that :-(. They are also pretty
simple.
> The whole point of stream I/O, I thought, was that for the first time
> it frees the Fortran programmer from the shackles of record-based I/O.
I would also say that this majorly mischaracterized the main
motivations for adding stream I/O. Well, I guess you've got in in other
material, but with a different emphasis than I would use. I consider
the primary motivation for unformatted stream access to be
interoperability (and formatted stream was just an "add-on" in my view,
as I mention above). In fact, stream I/O originally was introduced as
part of the C interop stuff, though it has subsequently been identified
as a separate feature in its own right. You need unformatted stream to
deal with independently defined file formats (such as graphics image
files and many others). Prior to stream I/O, there was no way to do
this that was sanctioned by the standard.
"Faking it" with direct access files often worked, but that involved
making assumptions about implementation details that were not
guaranteed by the standard (and the assumptions were not always
correct). It was also quite a bit of work and had multiple
complications. It was one area where I regularly recommended that
people go ahead and use vendor extensions.
The lack of record structure is more of a side matter to me. That's a
consequence of the interop needs rather than a basic requirement on its
own.
As with formatted streams, there are times when unformatted streams are
more convenient, even independent of interop issues. This is
particularly so when you need random access, but don't want to be
shackled with a fixed record size (the limitation to fixed record size
*IS* something I regard as a shackle, though one I understand the
reasons for). Even if you do need a record structure, if you need both
random access and variable record size, it is usually far easier to do
your own record management starting from unformatted stream files than
to hack up something from what was available in previous Fortran
standards.
But if variable-size random access records were the main goal, I think
that could have been more directly addressed. I view the interop issue
as the primary goal, with the other benefits as handy "free" extras.
Admittedly, the separation here isn't 100%; sometimes interoperable
files have requirements for random access to variable-sized chunks of
data, so it is not a coincidence that you end up with ways to do that.
--
Richard Maine | Good judgment comes from experience;
[log in to unmask] | experience comes from bad judgment.
| -- Mark Twain
|