Chris Günther
3/22/2005 11:48:00 AM
Chris Guenther wrote:
> Hi,
>
> I am having trouble reading values from an existing (or maybe not yet
> exisiting) binary file:
> My target is to open a binary file for reading and writing (if it does not
> exisit it should be created).
> If the file was not yes existing I'd like to fill it with binary data to a
> certain predefined size.
> Later on I'd like to position my file position, and read and write whatever
> I like.
>
> The following piece does not work as intended:
>
> require 'pp'
> UNDER_UNIX = CONFIG['target_os'].to_s.index('linux')!=nil
> filename='foo.bin'
> size=1024
> dont_write=FileTest.exists?(filename) && File.stat(filename).size==size
> begin
> fd=File.open(filename,"ab+")
> fd.binmode unless UNDER_UNIX # assuming !UNIX=WINDOWS
> rescue => e
> pp e
> fd=File.open(filename,"wb+")
> puts "opened #{filename} with 'wib+'"
> end
>
> fd.sync=true
> fd.seek(0)
> unless dont_write
> bin_data = [0].pack('c')*(size)
> fd.write(bin_data)
> # OK now I really have a file of size 1024 with a binay 0 contents
> end
>
> ###.... then sometime later using the same file descriptor (fd) :
> requestes_stream_position = 900
> fd.pos=(requestes_stream_position)
> p "tell=#{fd.tell}"
> # Now please read 30 binary 0s into a binary string
> bin_value=fd.read(30)
>
> #### I ASSUMED THAT bin_value now is a "binary string of size 30", but
> unfortunately it is nil !!!
>
>
>
> Thanks in adcance,
> C.
>
>
>
>
>
Thanks Robert,
you are absolutely right with your remarks using a block. The code I
posted was just a small copied fraction of the real code, in which I
cannor use a block because the same fd will be stored in a hash for
later usage by another method.
Anyway, meanwhile I found the cause of this problem (again you are
right, it was not in the code I posted) , but now I have another related
problem that tricks my mind. I am trying to patch binary data in a file.
Unfortunately the data I am patching is not the data I get when reading
it back from the patched binary file.
Any ideas??
Thanks again in advance,
Chris
#!/usr/bin/env ruby
FNAME, FSIZE, OFFSET, VALUE = 'foooo.dat', 1024, 32,
[?c,?a,?f,?e].pack('cccc')
File.open(FNAME,"ab+") {|fd|
fd.pos=0
bin_data = [0].pack('c')*FSIZE
fd.write(bin_data)
}
File.truncate(FNAME,FSIZE)
File.open(FNAME,"ab+") {|fd|
fd.pos=0
data=fd.read(FSIZE)
data[OFFSET,VALUE.length]=VALUE
fd.pos=0
fd.write(data)
p "written modified piece of data = '#{data[OFFSET,VALUE.length]}'"
}
File.truncate(FNAME,FSIZE)
File.open(FNAME,"ab+") {|fd|
fd.pos=OFFSET
patched=fd.read(VALUE.length)
p "read modified piece of data = '#{patched}'"
puts "Oooops !!!" unless VALUE==patched
}