Re: File read-write mode: problem appending after reading

2006-10-16 Thread Frederic Rentsch
Tim Peters wrote:
 [Frederic Rentsch]
   
   Thanks a lot for your input. I seemed to notice that  everything
 works fine without setting the cursor as long as it stops before the end
 of the file. Is that also a coincidence that may not work?
 

 if you want to read following a write, or write following a read, on
 the same stream, you must perform a file-positioning operation
 (typically a seek) between them
   
I appreciate the clarification. Thanks!
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: File read-write mode: problem appending after reading

2006-10-14 Thread Frederic Rentsch
Tim,
  Thanks a lot for your input. I seemed to notice that  everything 
works fine without setting the cursor as long as it stops before the end 
of the file. Is that also a coincidence that may not work?
Frederic


Tim Peters wrote:
 [Frederic Rentsch]
   
Working with read and write operations on a file I stumbled on a
 complication when writes fail following a read to the end.

   f = file ('T:/z', 'r+b')
   f.write ('abcdefg')
   f.tell ()
 30L
   f.seek (0)
   f.read ()
 'abcdefg'
   f.flush ()  # Calling or not makes no difference
   f.write ('abcdefg')
 

 Nothing is defined about what happens at this point, and this is
 inherited from C.  In standard C, if you want to read following a
 write, or write following a read, on the same stream, you must perform
 a file-positioning operation (typically a seek) between them.

   
 Traceback (most recent call last):
   File pyshell#62, line 1, in -toplevel-
 f.write ('abcdefg')
 IOError: (0, 'Error')
 

 That's one possible result.  Since nothing is defined, any other
 outcome is also a possible result ;-)

   
 Flushing doesn't help.
 

 Right, and because flush() is not a file-positioning operation.

   
 I found two work arounds:

   f.read ()
 'abcdefg'
   f.read ()   # Workaround 1: A second read (returning an empty string)
 ''
   f.write ('abcdefg')
 (No error)
 

 Purely an accident; may or may not work the next time you try it, or
 on another platform; etc.

   
   f.read ()
 'abcdefg'
   f.seek (f.tell ())   # Workaround 2: Setting the cursor (to where it 
 is!)
 

 That's a correct approach.  f.seek(0, 1) (seek 0 bytes from the
 current position) is a little easier to spell.

   
   f.write ('abcdefg')
 (No error)

 I found no problem with writing into the file. So it looks like it has
 to do with the cursor which a read puts past the end, unless it is past
 the end, in which case it goes back to the end. Is there a less kludgy
 alternative to fseek (ftell ())?
 

 As above, you need to seek when switching from reading to writing, or
 from writing to reading.
   

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


Re: File read-write mode: problem appending after reading

2006-10-14 Thread Tim Peters
[Frederic Rentsch]
   Thanks a lot for your input. I seemed to notice that  everything
 works fine without setting the cursor as long as it stops before the end
 of the file. Is that also a coincidence that may not work?

if you want to read following a write, or write following a read, on
the same stream, you must perform a file-positioning operation
(typically a seek) between them
-- 
http://mail.python.org/mailman/listinfo/python-list


File read-write mode: problem appending after reading

2006-10-13 Thread Frederic Rentsch
Hi all,

   Working with read and write operations on a file I stumbled on a 
complication when writes fail following a read to the end.

  f = file ('T:/z', 'r+b')
  f.write ('abcdefg')
  f.tell ()
30L
  f.seek (0)
  f.read ()
'abcdefg'
  f.flush ()  # Calling or not makes no difference
  f.write ('abcdefg')

Traceback (most recent call last):
  File pyshell#62, line 1, in -toplevel-
f.write ('abcdefg')
IOError: (0, 'Error')

Flushing doesn't help. I found two work arounds:

  f.read ()
'abcdefg'
  f.read ()   # Workaround 1: A second read (returning an empty string)
''
  f.write ('abcdefg')
(No error)

  f.read ()
'abcdefg'
  f.seek (f.tell ())   # Workaround 2: Setting the cursor (to where 
it is!)
  f.write ('abcdefg')
(No error)

I found no problem with writing into the file. So it looks like it has 
to do with the cursor which a read puts past the end, unless it is past 
the end, in which case it goes back to the end. Is there a less kludgy 
alternative to fseek (ftell ())?

Frederic

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


Re: File read-write mode: problem appending after reading

2006-10-13 Thread Tim Peters
[Frederic Rentsch]
Working with read and write operations on a file I stumbled on a
 complication when writes fail following a read to the end.

   f = file ('T:/z', 'r+b')
   f.write ('abcdefg')
   f.tell ()
 30L
   f.seek (0)
   f.read ()
 'abcdefg'
   f.flush ()  # Calling or not makes no difference
   f.write ('abcdefg')

Nothing is defined about what happens at this point, and this is
inherited from C.  In standard C, if you want to read following a
write, or write following a read, on the same stream, you must perform
a file-positioning operation (typically a seek) between them.

 Traceback (most recent call last):
   File pyshell#62, line 1, in -toplevel-
 f.write ('abcdefg')
 IOError: (0, 'Error')

That's one possible result.  Since nothing is defined, any other
outcome is also a possible result ;-)

 Flushing doesn't help.

Right, and because flush() is not a file-positioning operation.

 I found two work arounds:

   f.read ()
 'abcdefg'
   f.read ()   # Workaround 1: A second read (returning an empty string)
 ''
   f.write ('abcdefg')
 (No error)

Purely an accident; may or may not work the next time you try it, or
on another platform; etc.

   f.read ()
 'abcdefg'
   f.seek (f.tell ())   # Workaround 2: Setting the cursor (to where it is!)

That's a correct approach.  f.seek(0, 1) (seek 0 bytes from the
current position) is a little easier to spell.

   f.write ('abcdefg')
 (No error)

 I found no problem with writing into the file. So it looks like it has
 to do with the cursor which a read puts past the end, unless it is past
 the end, in which case it goes back to the end. Is there a less kludgy
 alternative to fseek (ftell ())?

As above, you need to seek when switching from reading to writing, or
from writing to reading.
-- 
http://mail.python.org/mailman/listinfo/python-list