IO.pos bug?

A

andrey

irb(main):001:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):002:0> f.gets
=> "multi off\n"
irb(main):003:0> f.pos
=> 10
irb(main):004:0> f.gets
=> "order hosts,bind\n"
irb(main):005:0> f.pos
=> 27
irb(main):006:0> f.close
=> nil

All right.

irb(main):007:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):008:0> f.sysread(5)
=> "multi"
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 5

Bug?
% ruby1.8 --version
ruby 1.8.5 (2006-08-25) [i486-linux]
 
D

David A. Black

Hi --

irb(main):001:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):002:0> f.gets
=> "multi off\n"
irb(main):003:0> f.pos
=> 10
irb(main):004:0> f.gets
=> "order hosts,bind\n"
irb(main):005:0> f.pos
=> 27
irb(main):006:0> f.close
=> nil

All right.

irb(main):007:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):008:0> f.sysread(5)
=> "multi"
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 5

Bug?
% ruby1.8 --version
ruby 1.8.5 (2006-08-25) [i486-linux]

It works OK in 1.8.6:

irb(main):001:0> f = File.new("/etc/hosts")
=> #<File:/etc/hosts>
irb(main):002:0> f.sysread(5)
=> "##\n# "
irb(main):003:0> f.pos
=> 5
irb(main):004:0> f.sysread(10)
=> "Host Datab"
irb(main):005:0> f.pos
=> 15

I don't think 1.8.5 is supported any more, so it might be good to
update your installation if possible.


David
 
J

Johan Holmberg

Hi --

irb(main):001:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):002:0> f.gets
=> "multi off\n"
irb(main):003:0> f.pos
=> 10
irb(main):004:0> f.gets
=> "order hosts,bind\n"
irb(main):005:0> f.pos
=> 27
irb(main):006:0> f.close
=> nil

All right.

irb(main):007:0> f = File.new("/etc/host.conf")
=> #<File:/etc/host.conf>
irb(main):008:0> f.sysread(5)
=> "multi"
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 5

Bug?
% ruby1.8 --version
ruby 1.8.5 (2006-08-25) [i486-linux]

It works OK in 1.8.6:
[...]

I don't think 1.8.5 is supported any more, so it might be good to
update your installation if possible.

David

It works for me with 1.8.5 too:

irb(main):007:0> f = File.new("/tmp/jhjh")
=> #<File:/tmp/jhjh>
irb(main):008:0> f.sysread(5)
=> "multi"
irb(main):009:0> f.pos
=> 5
irb(main):010:0> f.sysread(10)
=> " off\norder"
irb(main):011:0> f.pos
=> 15

$ ruby -v
ruby 1.8.5 (2006-08-25) [powerpc-darwin8.8.0]

I have built this "ruby" myself from source (but note that it is on
Mac OS X, not Linux).

/Johan Holmberg
 
J

John Slobbe

Same here...on ruby 1.8.7 (2008-06-20 patchlevel 22) [i686-linux]

Regards, John.

irb(main):001:0> f = File.new("/etc/hosts")
=> #<File:/etc/hosts>
irb(main):002:0> f.sysread(5)
=> "#\n# /"
irb(main):003:0> f.pos
=> 5
irb(main):004:0> f.sysread(10)
=> "etc/hosts:"
irb(main):005:0> f.pos
=> 5
irb(main):006:0>
 
P

Peña, Botp

From: John Slobbe [mailto:[email protected]]=20
# Same here...on ruby 1.8.7 (2008-06-20 patchlevel 22) [i686-linux]
# irb(main):001:0> f =3D File.new("/etc/hosts")
# =3D> #<File:/etc/hosts>
# irb(main):002:0> f.sysread(5)
# =3D> "#\n# /"
# irb(main):003:0> f.pos
# =3D> 5
# irb(main):004:0> f.sysread(10)
# =3D> "etc/hosts:"
# irb(main):005:0> f.pos
# =3D> 5

i seem to remember (don't know where/when) that you must not mix low =
level calls like #sysread w highlevel calls like #pos, use #read with =
#pos, or use #sysread w #sysseek

but i guess we need a confirmation fr the core dev to verify that. Nobu =
perhaps?

eg,

irb(main):016:0> File.open "/etc/hosts" do |f|
irb(main):017:1* f.sysread 2
irb(main):018:1> p f.sysseek(0,IO::SEEK_CUR)
irb(main):019:1> f.sysread 10
irb(main):020:1> p f.sysseek(0,IO::SEEK_CUR)
irb(main):021:1> end
2
12
=3D> nil

irb(main):022:0> RUBY_VERSION
=3D> "1.8.7"

hth.
kind regards -botp
 
N

Nobuyoshi Nakada

Hi,

At Thu, 31 Jul 2008 10:31:24 +0900,
Pe=F1a said:
i seem to remember (don't know where/when) that you must not
mix low level calls like #sysread w highlevel calls like
#pos, use #read with #pos, or use #sysread w #sysseek
=20
but i guess we need a confirmation fr the core dev to verify
that. Nobu perhaps?

You're correct, it depends on underlying libc, since 1.8 uses
stdio. 1.9 has its own buffering mechanism and doesn't have
that issue.

--=20
Nobu Nakada
 

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,968
Messages
2,570,152
Members
46,698
Latest member
LydiaHalle

Latest Threads

Top