Thanks for the report. I've fixed this in R-devel so that even on macOS, one can read data added to a file after end of the file has once been reached, which also changes the behavior of your example on macOS to match Linux (and Windows).

The difference comes from the C library shipped with the operating system. According to the C standard, functions for reading from file, such as fgetc() and fread(), should always fail to read data and indicate an end of file when the end of file indicator has already been set on the file. The C library on macOS behaves this way. On Linux and Windows, however, the read operations instead check again if any new data is present, even if the end-of-file indicator has been already set. That seems to be in violation of the standard, but it made the example program work without any attempt made on the R side to make it work (and this behavior is not documented). I've modified R-devel to clear the end of file indicator so that the behavior observed in R on Windows and Linux can now be observed also on macOS. Unless problems are found with this change, it would be part of the next (minor or major) R release.

Strictly speaking, the example program is not portable: it opens the same file twice in the same process, which is implementation-defined behavior according to the C standard, yet it happens to work on current platforms R is supported on. I understand it is just an example and the real use case is that two processes communicate this way. I don't know the exact use case, but it might be more reliable in principle to use a different communication mechanism, such as a fifo or multiple files (each read only once) or a combination of both.

Best
Tomas

On 10/27/24 13:13, martin gregory via R-help wrote:
I was using readLines to read data from a file which is being written to by 
another
process. readLines documentation says "If the connection is open it is read 
from its
current position". With R 4.4.1 on Linux 5.15.160 this is true but does not 
seem to be the
case as far as R 4.4.1 on MacOS 12.7.6 (Intel) is concerned. Here, the first 
write to the
file is read correctly but subsequent reads return nothing. The minimal program 
below
shows the behaviour and produces the following results:

Linux:
input 1: lines written/read: 4 / 4
input 2: lines written/read: 3 / 3
input 3: lines written/read: 2 / 2

MacOS:
input 1: lines written/read: 4 / 4
input 2: lines written/read: 3 / 0
input 3: lines written/read: 2 / 0

I have searched NEWS and found only 
https://bugs.r-project.org/show_bug.cgi?id=18555, but
I am not specifying an encoding so not sure whether it is relevant or not.

I also tried with a 1 second delay between flush and read, but this had no 
effect.

I have found an alternative, scan with skip of the number lines already read, 
and this
works on both Linux and MacOS.  But I would still like to know how to have 
readLines work
with open connections on MacOS.

Regards,
Martin

## Program to demonstrate the behaviour
## input data
rL <- list(paste0("Line ", 1:4), paste0("Line ", 1:3), paste0("Line ", 1:2))
## create an empty file and open write and read connections to the file
close(file("rL.log",open="w"))
rLconn.w <- file("rL.log", open="a")
rLconn.r <- file("rL.log", open="r")
## write the test data and read it
for (i in 1:3) {
     writeLines(rL[[i]], rLconn.w)
     flush(rLconn.w)
     out <- readLines(rLconn.r, warn=FALSE)
     writeLines(c(paste0("input ", i, ": lines",
                         " written/read: ", length(rL[[i]]),
                         " / ", length(out))))
}
close(rLconn.w)
close(rLconn.r)

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide https://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to