I *think* that the docs are wrong here. `file-position` maps onto
`lseek` on posix systems (pretty sure about this after a quick perusal
of the code) and `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.

So the file isn't really extended until you write something at that
position. But I'm sure Matthew can dive a definitive answer here.

- Jon




On Mon, Jun 24, 2019 at 4:31 PM David Storrs <david.sto...@gmail.com> wrote:
>
> Consider the following test script:
>
> #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 "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 "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 "file size, position: " (file-size the-path) ", " (file-position 
> the-port)))
>
>
> The output is:
>
> before open, file exists?: #f
> after open, file exists?: #t
> file size, position: 0, 0
> file size, position: 0, 1000
> file size, position: 0, 1000
>
> The file on disk is in fact 0B long.  The docs for file-position 
> (https://docs.racket-lang.org/reference/port-buffers.html#%28def._%28%28quote._~23~25kernel%29._file-position%29%29)
>  include the following:
>
> "When file-position sets the position pos beyond the current size of an 
> output file or (byte) string, the file/string is enlarged to size pos and the 
> new region is filled with 0 bytes. If pos is beyond the end of an input file 
> or (byte) string, then reading thereafter returns eof without changing the 
> port’s position."
>
> Given the above, I was expecting the file to end up being 1000 bytes.  I'm 
> using Racket 7.1 on OSX 10.11; is this an OS issue or am I misunderstanding 
> something about Racket?
>
> --
> 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/CAE8gKofKWtAKU4ZQk6ai-ydZx7WmY8%3D1GwDUFbW15BpxUSQ1qw%40mail.gmail.com.
> For more options, visit https://groups.google.com/d/optout.

-- 
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/CAKfDxxw0cj%3D2EJBN2gjRjCGiYELrhhMxAz4-tuB%3DuoDX-phoBA%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to