[fpc-pascal]Problems with FileIO
RGrunsky at sympatico.ca
RGrunsky at sympatico.ca
Thu Nov 7 05:54:48 CET 2002
In <5.1.0.14.0.20021106002744.00bbd690 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