Aaron Goodman
2018-May-26 03:15 UTC
[Rd] Buffering in R 3.5 connections causes incorrect data in readChar
I noticed an issue where readChar does not return the correct value after a call to readline. It appears that readChar is not aware of the buffering, so it reads from the end of the buffer, rather than the current position in the file. This is a significant change of behavior from R-3.4.4. Below is a test case that I used to home in on the problem. --- p<-"test2.txt" cat("abcdefg hijklmn opqrstu",file=p) cat("read char after readline (h)\n") con <- file(p,"r") invisible(readLines(con,1)) print(readChar(con,1)) close(con) cat("read char after readline and seek (h)\n") con <- file(p,"r") invisible(readLines(con,1)) invisible(seek(con,seek(con))) print(readChar(con,1)) close(con) cat("read lines after readline (hijklmn)\n") con <- file(p,"r") invisible(readLines(con,1) ) print(readLines(con,1)) close(con) cat("read line after char (bcdefg):\n") con <- file(p,"r") invisible(readChar(con,1) ) print(readLines(con,1)) close(con) [[alternative HTML version deleted]]
Tomas Kalibera
2018-May-29 10:09 UTC
[Rd] Buffering in R 3.5 connections causes incorrect data in readChar
On 05/26/2018 05:15 AM, Aaron Goodman wrote:> I noticed an issue where readChar does not return the correct value after a > call to readline. It appears that readChar is not aware of the buffering, > so it reads from the end of the buffer, rather than the current position in > the file. This is a significant change of behavior from R-3.4.4. > > Below is a test case that I used to home in on the problem.Thanks for the report and analysis, you are right, readChar ignores the buffer (and it also ignores the pushback). But please note that this behavior is in line with the documentation, see ?readChar: readChar must only be used with binary connections, but the example uses it on a text connection. Buffering and pushback are only used on (readable) text connections. I will check whether we could report a runtime error. Best Tomas> --- > > p<-"test2.txt" > cat("abcdefg > hijklmn > opqrstu",file=p) > > cat("read char after readline (h)\n") > con <- file(p,"r") > invisible(readLines(con,1)) > print(readChar(con,1)) > close(con) > > cat("read char after readline and seek (h)\n") > con <- file(p,"r") > invisible(readLines(con,1)) > invisible(seek(con,seek(con))) > print(readChar(con,1)) > close(con) > > cat("read lines after readline (hijklmn)\n") > con <- file(p,"r") > invisible(readLines(con,1) ) > print(readLines(con,1)) > close(con) > > > cat("read line after char (bcdefg):\n") > con <- file(p,"r") > invisible(readChar(con,1) ) > print(readLines(con,1)) > close(con) > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel
Aaron Goodman
2018-May-29 22:00 UTC
[Rd] Buffering in R 3.5 connections causes incorrect data in readChar
Tomas, Thank you for the explanation. I see in the documentation: "These functions are intended to be used with binary-mode connections." So I see how using it on a text connection is undefined, and not a bug. An error or warning when attempting to use a it on a text connection would be helpful considering how the behavior has changed in R-3.5. On Tue, May 29, 2018 at 3:09 AM, Tomas Kalibera <tomas.kalibera at gmail.com> wrote:> On 05/26/2018 05:15 AM, Aaron Goodman wrote: > >> I noticed an issue where readChar does not return the correct value after >> a >> call to readline. It appears that readChar is not aware of the buffering, >> so it reads from the end of the buffer, rather than the current position >> in >> the file. This is a significant change of behavior from R-3.4.4. >> >> Below is a test case that I used to home in on the problem. >> > Thanks for the report and analysis, you are right, readChar ignores the > buffer (and it also ignores the pushback). But please note that this > behavior is in line with the documentation, see ?readChar: readChar must > only be used with binary connections, but the example uses it on a text > connection. Buffering and pushback are only used on (readable) text > connections. I will check whether we could report a runtime error. > > Best > Tomas > > --- >> >> p<-"test2.txt" >> cat("abcdefg >> hijklmn >> opqrstu",file=p) >> >> cat("read char after readline (h)\n") >> con <- file(p,"r") >> invisible(readLines(con,1)) >> print(readChar(con,1)) >> close(con) >> >> cat("read char after readline and seek (h)\n") >> con <- file(p,"r") >> invisible(readLines(con,1)) >> invisible(seek(con,seek(con))) >> print(readChar(con,1)) >> close(con) >> >> cat("read lines after readline (hijklmn)\n") >> con <- file(p,"r") >> invisible(readLines(con,1) ) >> print(readLines(con,1)) >> close(con) >> >> >> cat("read line after char (bcdefg):\n") >> con <- file(p,"r") >> invisible(readChar(con,1) ) >> print(readLines(con,1)) >> close(con) >> >> [[alternative HTML version deleted]] >> >> ______________________________________________ >> R-devel at r-project.org mailing list >> https://stat.ethz.ch/mailman/listinfo/r-devel >> > > >[[alternative HTML version deleted]]
Maybe Matching Threads
- Buffering in R 3.5 connections causes incorrect data in readChar
- Buffering in R 3.5 connections causes incorrect data in readChar
- readChar() could read the whole file by default?
- [External] readChar() could read the whole file by default?
- [External] readChar() could read the whole file by default?