I actually did try writing something at the extended position, although I
removed it before posting the above.  Even with a write, it still does not
do as expected.  In fact, the results are even stranger:

#lang racket

(define (say . args) (displayln (apply ~a args)))
(define the-path "./test-file")
(when (file-exists? the-path)  (delete-file the-path))
(say "before open, file exists?: " (file-exists? the-path))

(let ([the-port (open-output-file the-path #:mode 'binary #:exists
'append)])
  (say "after open, file exists?: " (file-exists? the-path))
  (say "before repos, file size, position: " (file-size the-path) ", "
       (file-position the-port))
  (file-position the-port 1000); should extend the file and fill the
intervening space with 0
  (say "before flush, file size, position: " (file-size the-path) ", "
       (file-position the-port))
  (flush-output the-port) ; ensure that the filling 0s have been written,
just to be sure
  (say "before write, file size, position: " (file-size the-path) ", "
       (file-position the-port))

  (write "foo" the-port)
  (say "before 2nd flush, file size, position: "
       (file-size the-path) ", " (file-position the-port))
  (flush-output the-port)
  (say "finally, file size, position: " (file-size the-path) ", "
(file-position the-port))
  )
Ouptut:

before open, file exists?: #f
after open, file exists?: #t
before repos, file size, position: 0, 0
before flush, file size, position: 0, 1000
before write, file size, position: 0, 1000
before 2nd flush, file size, position: 0, 1005
finally, file size, position: 5, 5

Personally, i find this even weirder.  I wrote 3 characters, so why is the
file size 5?  (Which it is, on disk.)

On Mon, Jun 24, 2019 at 4:57 PM Jon Zeppieri <zeppi...@gmail.com> wrote:

> On Mon, Jun 24, 2019 at 4:51 PM Jon Zeppieri <zeppi...@gmail.com> wrote:
> >
> > `lseek` docs say:
> >
> > > The lseek() function shall allow the file offset to be set beyond the
> end of the existing data in the file. If data is later written at this
> point, subsequent reads of data in the gap shall return bytes with the
> value 0 until data is actually written into the gap.
> >
>
> And the Windows call `SetFilePosition` is similar:
>
> > It is not an error to set a file pointer to a position beyond the end of
> the file. The size of the file does not increase until you call the
> SetEndOfFile, WriteFile, or WriteFileEx function. A write operation
> increases the size of the file to the file pointer position plus the size
> of the buffer written, which results in the intervening bytes uninitialized.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/CAE8gKodw3c2wqUBdAPKRkX3hqin4fhZ8kjeFKh3LouFhY4-8XQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to