[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Binary file reading in Ruby

rohit2000s

12/21/2007 10:20:00 AM

Hi All,

I am trying to read in a binary file of size 'n' using:

mem_buf = IO.read(file_name, n, 0)

Where file_name is an argument to the script.

But after the read I observed that the size of the mem_buf is less
than 'n' (It should be equal to 'n').

(mem_buf.size != n).

This script fails on the above read check.

Any ideas what I might be doing wrong here. Any help will be
appreciated.


Thanks in advance,
Rohit
4 Answers

Al Og

12/21/2007 10:41:00 AM

0

unknown wrote:

> mem_buf = IO.read(file_name, n, 0)
>
> Where file_name is an argument to the script.
>
> But after the read I observed that the size of the mem_buf is less
> than 'n' (It should be equal to 'n').

It looks like your file size is less than number of bytes you're trying
to read.
In this case size of the mem_buf must be equal to the file size.

mem_buf.size == File.size(file_name)

Regards,
arkadi4

--
Posted via http://www.ruby-....

Robert Klemme

12/21/2007 12:38:00 PM

0

2007/12/21, rohit2000s@yahoo.com <rohit2000s@yahoo.com>:
> Hi All,
>
> I am trying to read in a binary file of size 'n' using:
>
> mem_buf = IO.read(file_name, n, 0)
>
> Where file_name is an argument to the script.
>
> But after the read I observed that the size of the mem_buf is less
> than 'n' (It should be equal to 'n').
>
> (mem_buf.size != n).
>
> This script fails on the above read check.
>
> Any ideas what I might be doing wrong here. Any help will be
> appreciated.

Either, the file is smaller than n or you have an issue with
conversion (typically on Windows). For binary files I'd do this which
is more portable:

mem_buf = File.open(file_name,"rb") {|io| io.read}

Also, it helps documenting things. Bw, you do not need the offset and
size arguments.

Kind regards

robert

--
use.inject do |as, often| as.you_can - without end

rohit2000s

12/21/2007 2:34:00 PM

0

On Dec 21, 5:37 pm, Robert Klemme <shortcut...@googlemail.com> wrote:
> 2007/12/21, rohit20...@yahoo.com <rohit20...@yahoo.com>:
>
>
>
> > Hi All,
>
> > I am trying to read in a binary file of size 'n' using:
>
> > mem_buf = IO.read(file_name, n, 0)
>
> > Where file_name is an argument to the script.
>
> > But after the read I observed that the size of the mem_buf is less
> > than 'n' (It should be equal to 'n').
>
> > (mem_buf.size != n).
>
> > This script fails on the above read check.
>
> > Any ideas what I might be doing wrong here. Any help will be
> > appreciated.
>
> Either, the file is smaller than n or you have an issue with
> conversion (typically on Windows). For binary files I'd do this which
> is more portable:
>
> mem_buf = File.open(file_name,"rb") {|io| io.read}
>
> Also, it helps documenting things. Bw, you do not need the offset and
> size arguments.
>
> Kind regards
>
> robert
>
> --
> use.inject do |as, often| as.you_can - without end

Thanks a lot ! That was the exact problem I had - getting that part of
code to work on windows.

Could you please take time to detail a bit on:

"{|io| io.read}" part of the code.

Also is there a way to add the offset and size arguments to the read
method that you suggested ?

Thanks in advance,
Rohit

Robert Klemme

12/21/2007 8:05:00 PM

0

On 21.12.2007 15:34, rohit2000s@yahoo.com wrote:
> On Dec 21, 5:37 pm, Robert Klemme <shortcut...@googlemail.com> wrote:
>> 2007/12/21, rohit20...@yahoo.com <rohit20...@yahoo.com>:
>>
>>
>>
>>> Hi All,
>>> I am trying to read in a binary file of size 'n' using:
>>> mem_buf = IO.read(file_name, n, 0)
>>> Where file_name is an argument to the script.
>>> But after the read I observed that the size of the mem_buf is less
>>> than 'n' (It should be equal to 'n').
>>> (mem_buf.size != n).
>>> This script fails on the above read check.
>>> Any ideas what I might be doing wrong here. Any help will be
>>> appreciated.
>> Either, the file is smaller than n or you have an issue with
>> conversion (typically on Windows). For binary files I'd do this which
>> is more portable:
>>
>> mem_buf = File.open(file_name,"rb") {|io| io.read}
>>
>> Also, it helps documenting things. Bw, you do not need the offset and
>> size arguments.
>>
>> Kind regards
>>
>> robert
>>
>> --
>> use.inject do |as, often| as.you_can - without end
>
> Thanks a lot ! That was the exact problem I had - getting that part of
> code to work on windows.

You probably should have mentioned this. :-)

> Could you please take time to detail a bit on:
>
> "{|io| io.read}" part of the code.

It's the block form of File.open and the return value of File.open in
this case is the result of the block.

> Also is there a way to add the offset and size arguments to the read
> method that you suggested ?

http://ruby-doc.org/core/classes/IO.ht...

Cheers

robert