ken_yap_aus@yahoo.com
2002-Nov-29 04:46 UTC
[Rd] readBin or writeBin adds extra nulls (PR#2333)
Full_Name: Ken Yap
Version: 1.6.1
OS: Linux (SuSE 8.0)
Submission from: (NULL) (129.78.64.5)
I'm trying to copy a file using readBin and writeBin. (The reason is to be
able
to pipe PostScript or PDF output to a socket later, this is just an experiment.)
I do:
zz <- file("foo.ps", "rb")
r <- readBin(zz, character(), 1000000)
yy <- file("bar.ps", "wb")
writeBin(r, yy, character(), 1000000)
close(yy)
close(zz)
When I diff the files I see differences. Every 10000 characters, the output file
has
an extra null byte, and the last portion is missing. Maybe the missing part is
because I forgot to flush the output of something, if someone could explain how
to do it correctly that would be nice. The extra null byte seems to be due to an
off-by-one programming error somewhere perhaps? Or am I doing something wrong?
Thanks for the great software by the way.
dmurdoch@pair.com
2002-Nov-29 12:52 UTC
[Rd] readBin or writeBin adds extra nulls (PR#2333)
On Fri, 29 Nov 2002 04:45:46 +0100 (MET), you wrote:>I'm trying to copy a file using readBin and writeBin. (The reason is to be able >to pipe PostScript or PDF output to a socket later, this is just an experiment.) >I do: > >zz <- file("foo.ps", "rb") >r <- readBin(zz, character(), 1000000) >yy <- file("bar.ps", "wb") >writeBin(r, yy, character(), 1000000) >close(yy) >close(zz)I see differences between the files too; that looks like a bug. Ken should have been using readChar and writeChar (the version he was using breaks at ascii null characters); those appear to work properly. However, readBin and writeBin should be able to handle very long strings, or should report an error if they can't. Duncan Murdoch
ripley@stats.ox.ac.uk
2002-Nov-29 15:57 UTC
[Rd] readBin or writeBin adds extra nulls (PR#2333)
Please read the help page:
`readBin' and `writeBin' read and write C-style zero-terminated
character strings. `readChar' and `writeChar' allow more
flexibility, and can also be used on text-mode connections.
You don't have such character strings in a postscript file (if that is
what foo.ps is). The code arbitrarily breaks the input into strings of
length 10000 if it gets in trouble finding a null terminator. The bug is
not issuing a warning to the user if that happens.
You don't get the last part because there was no final null terminator,
so no qualifying string gets read.
You should be using either readChar (as the help page says) if you have a
text file, or integer() of size 1 if you really want to read a file of
bytes.
On Fri, 29 Nov 2002 ken_yap_aus@yahoo.com wrote:
> Full_Name: Ken Yap
> Version: 1.6.1
> OS: Linux (SuSE 8.0)
> Submission from: (NULL) (129.78.64.5)
>
>
> I'm trying to copy a file using readBin and writeBin. (The reason is to
be able
> to pipe PostScript or PDF output to a socket later, this is just an
experiment.)
> I do:
>
> zz <- file("foo.ps", "rb")
> r <- readBin(zz, character(), 1000000)
> yy <- file("bar.ps", "wb")
> writeBin(r, yy, character(), 1000000)
> close(yy)
> close(zz)
>
> When I diff the files I see differences. Every 10000 characters, the output
file
> has
> an extra null byte, and the last portion is missing. Maybe the missing part
is
> because I forgot to flush the output of something, if someone could explain
how
> to do it correctly that would be nice. The extra null byte seems to be due
to an
> off-by-one programming error somewhere perhaps? Or am I doing something
wrong?
>
> Thanks for the great software by the way.
>
> ______________________________________________
> R-devel@stat.math.ethz.ch mailing list
> http://www.stat.math.ethz.ch/mailman/listinfo/r-devel
>
--
Brian D. Ripley, ripley@stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272860 (secr)
Oxford OX1 3TG, UK Fax: +44 1865 272595