* Gertjan Klein:
Alf P. Steinbach wrote:

So with 'w+' the only way to get garbage is if 'read' reads beyond the end of file, or 'open' doesn't conform to the documentation.

It does read beyond the end of file. This is perhaps the way the
underlying C library works, but it looks like an "unexpected feature"
(read: bug) to me.

I reproduced (with Python 2.5.2 on WinXP) the code the OP wrote after
creating an empty (0-byte) test file; after the write() the read()
returns random garbage. I can't imagine why anyone would want that
behaviour. The file grew to be 4099 bytes after f.close(). I wrote
'hello' to it, so the length of garbage added was 4094 bytes, which I
find a strange number also.

Could you post (copy and paste) the code, and description of results?


I would have expected the read to return nothing. Can anyone explain or
even defend this behaviour?

I'm just a Python newbie, but in C and C++ such things are usually down to "undefined behavior", that is, the program doing something that is implicitly or explicitly defined as undefined behavior by the language standard.

With UB the effect may then be something or nothing or anything or just what you expected; appearance of the infamous nasal demons is one possibility...

Quoting n869, which is the January 18th 1999 draft of the C99 standard:

  §7.19.5.3/6
  When a file is opened with update mode (’+’ as the second or third
  character in the above list of mode argument values), both input and
  output may be performed on the associated stream. However, output shall
  not be directly followed by input without an intervening call to the
  fflush function or to a file positioning function (fseek, fsetpos, or
  rewind), and input shall not be directly followed by output without an
  intervening call to a file positioning function, unless the input
  operation encounters end-of-file. Opening( or creating) a text file with
  update mode may instead open (or create) a binary stream in some
  implementations.

"Shall not" means UB. This applies to C "FILE*" handling.

AFAICS nothing except efficiency prevents the Python wrapper, if "FILE*" is what it uses, from automatically inserting an appropriate fflush or fseek.

And for a language used by so many newbies (this is positive!) I agree that it should ideally get rid of that UB (assuming that's what the problem is), or, if it doesn't already, mention that in the Python documentation.


Cheers,

- Alf
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to