Weird behavior with IO#read

Okay, maybe I just need to take a break from coding for a couple of
hours, but I can't for the life of me figure out what's going wrong
with this code:

···

--
BLOCKSIZE=1024*256
open('testdata.in') do |input|
  open('testdata.out') do |output|
    while (chunk = input.read(BLOCKSIZE)) do
      output.write(chunk)
    end
  end
end
--

On Linux with 1.8.2-preview2, it works as expected (and much faster
than I anticipated, which is good). On Windows XP using the latest
one-click, it terminates after a single iteration through the 'while'
loop. Changing the blocksize doesn't make a difference; neither does
using a different looping construct.

It seems like this is a bug in the Ruby interpreter, but it also seems
so basic as to be unlikely to have slipped under the radar in testing.
Can anyone else confirm this behavior? I'll try again in a few hours
when I get home, but would like to stop banging my head against the
problem sooner than that, if possible.

--
Lennon
rcoder.net

Hi,

Okay, maybe I just need to take a break from coding for a couple of
hours, but I can't for the life of me figure out what's going wrong
with this code:

--
BLOCKSIZE=1024*256
open('testdata.in') do |input|
  open('testdata.out') do |output|
    while (chunk = input.read(BLOCKSIZE)) do
      output.write(chunk)
    end
  end
end
--

On Linux with 1.8.2-preview2, it works as expected (and much faster
than I anticipated, which is good). On Windows XP using the latest
one-click, it terminates after a single iteration through the 'while'
loop. Changing the blocksize doesn't make a difference; neither does
using a different looping construct.

Is there binary data in the files? If so try opening them
in binary mode ("rb" and "wb")... Windows sees ^Z as end of
file in "text mode"... an artifact stupidly inherited from
a filesystem that needed it because it only measured file
sizes in blocks and didn't know where the precise end of file
was without the marker character. ("Stupidly inherited"
because windows has never needed that to know where the true
end of file is.)

Hope this helps,

Regards,

Bill

···

From: "Lennon Day-Reynolds" <rcoder@gmail.com>

Lennon Day-Reynolds wrote:

   while (chunk = input.read(BLOCKSIZE)) do

Too much C programming? I thought that we "shouldn't" use tests like these
in Ruby -- in other words, we should test 'chunk' against 'nil' or emptyness
or something. But then, you say it works OK on one platform...

Thank you, Bill. You're right -- I was opening the files in text mode.

See, I had just been coding for too long.

Thanks again.

···

--
Lennon
rcoder.net