Delphi: Lecture d'un fichier avec un tableau dynamique
Je pensais pouvoir utiliser un tableau dynamique de Byte pour charger en mémoire la totalité d'un fichier binaire au moyen du code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| var
f: file
ByteArray1 : Array of Byte
begin
if opendialog1.execute then
begin
assignFile(F,Opendialog1.FileName);
FileMode := fmOpenRead;
Reset(F,1);
Taille:= FileSize(F);
SetLength(ByteArray1,Taille);
showmessage(IntTostr(Taille));
Reset(F,1);
BlockRead(F,ByteArray1,Taille);
end;
end. |
Le projet compile bien mais, à l'exécution, j'obtiens le message d'erreur suivant à la ligne Blockread (F, Bytearray1, taille)
Le projet a déclanché la classe d'exception EInOuterror avec le message "Error E/S 998"
Quelle est mon erreur SVP ?
[Modération]
Merci d'utiliser les balises code ou quote,Laurent Dardenne
[/Modération]
Re: Delphi: Lecture d'un fichier avec un tableau dynamique
essay sa si mam mémoir est bon
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
type
PTableau=^Tableau;
Tableau=array[0..Max(DWord)-1] of byte;
var
f: file of char; // ou of byte
BA :PTableau;
taille,i:integer;
begin
if opendialog1.execute then
begin
assignFile(F,Opendialog1.FileName);
Reset(F); //
Taille:= FileSize(F);
getmem(ba,taille);
showmessage(IntTostr(Taille));
Reset(F);
BlockRead(F,BA,Taille,i);
closefile(f);
end;
end. |
ici tableau est un pointeur sur une mémoir a peut prés continu
pour un tableau dynamique j'ai déja essayer mais quelque fois sa marche une autre fois sa marche pas, car la location de mémoir ici n'est pas continu( pas un seul bloc de mémoir) :koi:
Delphi: Lecture d'un fichier avec un tableau dynamique
Je reviens à mon programme après un break de quelques jours. Merci pour les idées que j'ai combinées pour pouvoir obtenir directement un tableau de byte (je tiens à ce type).
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
type
Tbyte = array[0..0] of byte;
PTbyte =^TByte;
var
ms : TFileStream;
ByteArray1 : PTbyte;
size : Integer;
c: integer;
if opendialog1.execute then
begin
ms:=TFileStream.Create(opendialog1.Filename,fmOpenRead);
try
//ms.Seek(0, soFromBeginning);
size:=ms.Size;
getmem(ByteArray1,size);
ms.readbuffer(ByteArray1^,size);
c:=3;
{$RangeChecks Off}
showmessage(char(ByteArray1[c]));
{$RangeChecks On}
finally
ms.Free();
end; |
Ce code est très proche du code C++ que je veux porter en Delphi.
Le Tableau ByteArray1 peut être manipulé comme un tableau normal à condition de dire au compilateur de ne pas faire vérifier à l'exécution le respect des limites du tableau qui ici sont réduites au minimum 0..0. À noter qu'une instruction "showmessage message(char (Bytearray1 [3]] );" est rejetée par le compilateur qui ne s'applique pas la permissivité qu'il autorise à l'exécution. Il faut donc passer par une variable pour indexer le tableau, mais ce n'est pas vraiment génant à l'utilisation. Par contre il faut être rigoureux pour ne pas dépasser la taille nominale du tableau dans les accès. On retrouve ici le côté dangereux du C++.
Je pense qu'on doit pouvoir aussi choisir les bornes du tableau avec une déclaration du type Tbyte = array[5..5] of byte; mais je ne l'ai pas vérifié.