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
--
Rails training from David A. Black and Ruby Power and Light:
* Advancing With Rails August 18-21 Edison, NJ
* Co-taught by D.A. Black and Erik Kastner
See http://www.rubypal.com for details and updates!
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
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>
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
=> nil
irb(main):022:0> RUBY_VERSION
=> "1.8.7"
hth.
kind regards -botp
At Thu, 31 Jul 2008 10:31:24 +0900,
Peña, Botp <bo...@delmonte-phil.com> wrote in [ruby-talk:309630]:
> 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?
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.
--
Nobu Nakada