[Rd] Opening a file in mode "r+" or "r+b"

Prof Brian Ripley ripley at stats.ox.ac.uk
Sat May 24 11:11:55 MEST 2003


This is already corrected in R-patched and R-devel: see their NEWS files.


On Fri, 23 May 2003, Laurens Leerink wrote:

> While using the file functions have found a few more issues (on both Unix
> and Windows) ie
> 
> R documentation: 
> In the "close" description (base package) we see that the possible values
> for the mode 'open' the "r+" and "r+b" values are repeated, and are
> incorrect the second time. The second set actually corresponds to the "w+" /
> "w+b", see "man fopen" on unix.
> 
> File connections:
> I had trouble using "r+" / "r+b" modes when processing files, all files
> opened in this mode does not allow one to write to the file.  Saw that the
> isOpen(con, "w") function always returns F in this mode, ie one can read
> from them but cannot write.  After experimenting with flag combinations it
> seems that all the other modes work well, so looked at the source code.  If
> I'm not mistaken line 247 in connections.c should be changed from
> 
>     if(mlen >= 2 && con->mode[1] == '+') con->canread = TRUE;
> 
> to
> 
>     if(mlen >= 2 && con->mode[1] == '+') con->canwrite = TRUE;
> 
> This explained my earlier R script tests, ie that the only way to write to a
> file is to truncate it ("w"/"w+" flag) or by appending to it ("a"/"ab").
> 
> Regards,
> Laurens
> 
> >  -----Original Message-----
> > From: 	Laurens Leerink  
> > Sent:	Friday, May 23, 2003 9:33 AM
> > To:	'r-help at stat.math.ethz.ch'
> > Subject:	isSeekable returns F on seekable file
> > 
> > Hi,
> > 
> > Seems that on RWin 1.7.0 and 1.6.2 isSeekable returns F on binary files,
> > while seek() works as expected on the same connection - see example below:
> > 
> > > con = file(nm, "rb")
> > > isSeekable(con)
> > [1] FALSE
> > > readBin(con, double(), 10)
> >  [1] 7.263824e-317 5.968155e-317 2.340685e-317 2.734062e-312 4.088386e-312
> > 4.670335e-317
> >  [7] 6.097545e-317 3.396341e-312 6.615484e-317 1.365171e-312
> > > readBin(con, double(), 10)
> >  [1] 1.303796e-317 5.577835e-317 3.409314e-312 1.303543e-317 3.893617e-317
> > 4.077940e-312
> >  [7] 6.910006e-313 2.694357e-318 4.088373e-312 6.484955e-317
> > > seek(con, 0, origin="start")
> > [1] 160
> > > readBin(con, double(), 10)
> >  [1] 7.263824e-317 5.968155e-317 2.340685e-317 2.734062e-312 4.088386e-312
> > 4.670335e-317
> >  [7] 6.097545e-317 3.396341e-312 6.615484e-317 1.365171e-312
> > > 
> > 
> > Am I doing something silly or is the function returning the wrong value?
> > 
> > Regards,
> > Laurens Leerink
> 
> 	[[alternate HTML version deleted]]
> 
> ______________________________________________
> R-devel at stat.math.ethz.ch mailing list
> https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
> 

-- 
Brian D. Ripley,                  ripley at 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 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



More information about the R-devel mailing list