[Rd] readBin(what="character", n=overcount)->extra "" in result (PR#9361)
Bill Dunlap
bill at insightful.com
Mon Nov 13 21:06:28 CET 2006
On Mon, 13 Nov 2006 bill at insightful.com wrote:
> When I use readBin() to read an unknown number
> of null-terminated strings from a file by supplying
> an overcount as the n= argument, it appends an empty
> string to the result.
>
> > tf<-tempfile()
> > strings<-c("One","Two","Three")
> > writeBin(strings, con=tf)
> > readBin(con=tf,what="character",n=100) # expect "One","Two","Three" only
> [1] "One" "Two" "Three" ""
I think the fix is to src/library/connections.c, where
m (the number of items read) is initialized to 1 instead
of 0. It is later used to shorten the vector of read
objects:
if(m < n) {
PROTECT(ans = lengthgets(ans, m));
UNPROTECT(1);
}
*** connections.c-orig 2006-09-13 19:05:06.000000000 -0700
--- connections.c 2006-11-13 11:46:35.000000000 -0800
***************
*** 2740,2746 ****
if(!strcmp(what, "character")) {
SEXP onechar;
PROTECT(ans = allocVector(STRSXP, n));
! for(i = 0, m = i+1; i < n; i++) {
onechar = isRaw ? rawOneString(bytes, nbytes, &np)
: readOneString(con);
if(onechar != R_NilValue) {
--- 2740,2746 ----
if(!strcmp(what, "character")) {
SEXP onechar;
PROTECT(ans = allocVector(STRSXP, n));
! for(i = 0, m = 0; i < n; i++) {
onechar = isRaw ? rawOneString(bytes, nbytes, &np)
: readOneString(con);
if(onechar != R_NilValue) {
More information about the R-devel
mailing list