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 }