Weird behavior with IO#read

  • Thread starter Lennon Day-Reynolds
  • Start date
L

Lennon Day-Reynolds

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.
 
B

Bill Kelly

Hi,

From: "Lennon Day-Reynolds said:
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
 
M

Mike Hall

Lennon said:
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...
 
L

Lennon Day-Reynolds

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top