IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Delphi: Lecture d'un fichier avec un tableau dynamique


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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]

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 886
    Points : 11 410
    Points
    11 410
    Billets dans le blog
    6
    Par défaut
    essaye pê un truc du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockRead(F,   @ByteArray1[0],   Taille);

  3. #3
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut Re: Delphi: Lecture d'un fichier avec un tableau dynamique
    essay sa si mam mémoir est bon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Au lieu de :
    BlockRead(F,ByteArray1,Taille);
    Essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BlockRead(F,ByteArray1[0],Taille);

  5. #5
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    Salut.
    Pourquoi ne pas utiliser les streams :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Var
      _ms : TMemoryStream;
      _buffer : String;
      _i : Integer;
    begin
      If OpenDialog1.Execute() And FileExists(OpenDialog1.FileName) Then Begin
        _ms := TMemoryStream.Create();
        Try
          _ms.LoadFromFile(OpenDialog1.FileName);
          _i := _ms.Size;
          If ( _i > 0 ) Then Begin
            SetLength(_buffer,_i);
            Move(_ms.Memory^,_buffer[1],_i);
            ShowMessage(_buffer);
          End;
        Finally
          _ms.Free();
        End;
      End;
    End;

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é.

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Tu peux déclarer le type "Tbyte" comme "array[0..65000] of byte" pour éviter les directives $range (j'ai mis 65000 pour représenter la taille maximum traitée au hasard).
    Ca n'a aucun impact sur l'occupation mémoire réélle puisque l'allocation dépend du Getmem.

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci d'utiliser les balises codes svp.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En effet, il semble bien que les directives {$RangeChecks} au compilateur ne soient pas nécessaires si on utilise ByteArray1 directement comme un tableau. Je suis un peu surpris car je croyais que le langage Pascal était nominalement très rigoureux sur le contrôle des accès.
    Cependant, je viens de vérifier que si on utilise ByteArray1 comme un pointeur (après tout il est déclaré pointeur et non tableau), l'instruction "showmessage message(char (bytearray1^[c]] );" impose l'utilisation des directives {$RangeChecks} pour pouvoir passer.

    Je découvre Delphi... qui semble avoir la souplesse de C++

    Merci

Discussions similaires

  1. Lecture dans un fichier (avec tableau)
    Par whytipi dans le forum Windows Forms
    Réponses: 2
    Dernier message: 04/07/2008, 13h42
  2. Probleme de lecture d'un fichier avec caractères speciaux
    Par bygui dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 26/06/2006, 10h35
  3. trier des fichiers avec un tableau flexgrid
    Par digger dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/12/2005, 16h20
  4. Problème lors de la lecture d'un fichier avec Input...
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 18/11/2005, 19h55
  5. Réponses: 20
    Dernier message: 25/09/2005, 16h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo