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
}