[fpc-pascal]Problems with FileIO

RGrunsky at sympatico.ca RGrunsky at sympatico.ca
Thu Nov 7 05:54:48 CET 2002

In < at localhost>, on 11/06/02 
   at 12:46 AM, Eduardo Morras <nec556 at ave128.retena.es> said:

>Hello everyone:

>         I'm new to fpc and i'm trying to port some mac pascal code to 
>win32 console. I have this code to read 64 bytes of data from a file,
>work  with them and save a double and 64 bytes of data. Of course if
>blockread  reads f.e. 32 bytes it saves the double and 32 bytes. But
>when i want to  check the output file size is different from the
>expected. So i have an  input file of 4369 bytes, with 68 blocks of 64
>bytes plus a block of 17  bytes (4369-64*68), the output file size must
>be 68 * 8 + 68 * 64 + 1 * 8 +  1 * 17 = 4921 bytes. But i get 4896,
>which are 25 bytes less (25 bytes =  8(from double)+17(the last block
>size)). So, the program don't treat the  last data block. The debugger
>says error 100 (FileIO problem), but what can  i do make it work for?

>     cuant : Pointer to array[0..63] of byte;

>     Repeat
>           BytesLeidos := 64;
>           blockread(FileIn,Entrada^,BytesLeidos);
>           if BytesLeidos>0 then begin
>              AjustarBloque(BytesLeidos-1);                    
>//Substrac  1 for 0-based array bounds
>              CuantificarBloque(BytesLeidos-1);               
>//Substrac 1  for 0-based array bounds
>              blockwrite(FileOut,factor,sizeof(double));
>              blockwrite(FileOut,cuant^,BytesLeidos*sizeof(byte));
>           end;
>     Until (EOF(FileIn)) OR (BytesLeidos=0);


What size have you set the block size? By default, Blockread/write does
I/O in 128 byte blocks. You can change this in the reset, rewrite
statement. The count value refers to the number of blocks to read or
write. Setting count to 64 would result in a transfer of 128 * 64 bytes
or 8192 bytes.

A common mistake (at least common for me) is to forget that the count
parameter refers to the number of blocks and not the number of bytes and
that only full blocks are read or written. If you have read and write
variable numbers of bytes, then set the block size to one and then the
count parameter will always be the number of bytes.

Hope this helps

Rolf Grunsky

RGrunsky at sympatico.ca    Truth in her dress finds facts too tight
                         In fiction she moves with ease.
                                               Rabinranath Tagore

More information about the fpc-pascal mailing list