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

 Delphi Discussion :

Problème de gestion des fichiers


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 12
    Points
    12
    Par défaut Problème de gestion des fichiers
    Bonjour à tous,

    je suis confronté à un problème concernant la gestion des fichiers dans delphi .NET. Voici un exemple de code :

    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
    program Project1;
     
    {$APPTYPE CONSOLE}
     
    uses
      SysUtils;
     
    Type TDonnees = Record
      ValeurEntiere  : Integer;
      ValeurDecimale : Double;
    End;
     
    Var
      Donnees : TDonnees;
      Fichier : File Of TDonnees;
    Begin
       Donnees.ValeurEntiere := 1298;
       Donnees.ValeurDecimale := 78.123;
       AssignFile(Fichier,'Nom_du_fichier');
       Rewrite(Fichier);
       Write(Fichier,Donnees);
       CloseFile(Fichier);
    end.
    Mon problème c'est que lorsque je compile il m'affiche cette erreur en surlignant "Fichier : File Of TDonnees;" :

    [Pascal Error] Project1.dpr(15): E1025 Unsupported language feature: 'typed or untyped file'
    Savez-vous d'où viens cette erreur ?

    Merci d'avance pour votre aide !

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    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 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    l'erreur vient de ce qu'on n'est plus en Turbo Pascal...

    .net n'a pas retenu le support des fichiers de structures !

    donc, faire une classe qui contiendra un stream et reproduira le fonctionnement de ces fichiers indexés, ou utiliser des structures de fichiers plus "modernes" !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Eh bien j'étais loin de me douter que cette gestion des fichiers ne fonctionnais plus en .NET...

    donc, faire une classe qui contiendra un stream et reproduira le fonctionnement de ces fichiers indexés,
    Ce serais une bonne méthode dans mon cas (qui n'est pas aussi simple que l'exemple précédent ) mais je ne vois pas tellement comment faire ca, pourrais tu m'aiguiller ?

    Merci en tout cas de ta réponse rapide et même si c'est une mauvaise nouvelle je suis fixé !

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 707
    Points : 25 589
    Points
    25 589
    Par défaut
    Je n'ai quasiment jamais utilisé le file of, j'ai toujours préféré lire mon fichier en binaire, ... surtout que cela permet des structures différentes pour chaque ligne avec quelques astuces de bufferisation et de transtypage ...

    A la vieille école
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fichier : File;
     
    Reset(Fichier, SizeOf(Donnes)); 
    BlockRead(Fichier, Donnees, 1);
    A la méthode "objet"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Fichier: TFileStream;
     
    Fichier := TFileStream.Create(...);
    Fichier.Read(Donnees, SizeOf(Donnes));
    Attention au record pascal (structure win32) et record .NET (objet statique), il y a aussi des pièges la dessus ...

    cela ne change pas trop de chose ...


    Citation Envoyé par tourlourou Voir le message
    ou utiliser des structures de fichiers plus "modernes" !
    si tu penses, le XML cela plus de 15 ans, mais c'est à la mode, ... mais c'est si lent et verbeux ...
    si tu penses à autre chose, cela m'interesse de m'instruire ...

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    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 885
    Points : 11 403
    Points
    11 403
    Billets dans le blog
    6
    Par défaut
    voui, je pensais au XML, mais plus comme à la mode que pratique (performant, je ne sais pas) !

  6. #6
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104
    Par défaut
    J'avais écrit ceci il y a quelque temps :
    http://nono40.developpez.com/tutorie...ichiers-types/

    Si ça peut te donner des idées.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 707
    Points : 25 589
    Points
    25 589
    Par défaut
    Comme la lecture globale n'est plus autorisée
    on ne peut plus utiliser Stream.Read sur un buffer non typé ... c'est vraiement con ce .NET, comment allonger un code inutilement, rajouté de la maintenance pour rien ...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup à vous tous ! Je vais tester ca sur mon code on verra bien !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    Je reviens vers vous car malgrès mes recherche plutôt fructueuse je n'arrive pas à utiliser TFileStream... Voila mon code :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    type TMap = record
      Name : string[255];
      Cubes : array[1..n] of vector3;
      NBCubes : integer;
      Cles: array[1..n] of vector3;
      NBCles : integer;
      Pieges : array[1..n] of vector3;
      NBPieges : integer;
      Start : Vector3;
      Finish : Vector3;
      MusicPath : string[255];
    end;
     
    function OuvrirFichier(Nom : TFileName; var mrec : TMap) : boolean;
    var f : TFileStream;
        i : integer;
    begin
      // Ouvre un fichier et affecte les données à un record
      f := nil;
      try
        // Ouverture d'un flux sur le fichier en lecture.
        // Le fichier reste accessible en lecture seule pour d'autres appli.
        f := TFileStream.Create(Nom, fmOpenRead or fmShareDenyWrite);
        try
         f.Position := 0; // Début du flux
          if (pos('.map', ExtractFileName(Nom)) > 0) then // Vérification du type du Fichier
    	begin
    		// Lecture du fichier
    		while (F.position < F.Size) do // Tant que la fin du fichier n'est pas atteinte faire :
    			begin
    				with mrec do // voir TMap pour savoir quelle type de donnée nous avons.
    					begin
    						// Lit la valeur et déplace la position en cours
    						f.ReadBuffer(Name, 255);
    						f.ReadBuffer(Cubes, n);
    						f.ReadBuffer(NBCubes, SizeOf(integer));
    						f.ReadBuffer(Cles, n);
    						f.ReadBuffer(NBCles, SizeOf(integer));
    						f.ReadBuffer(Pieges, n);
    						f.ReadBuffer(NBPieges, SizeOf(integer));
    						f.ReadBuffer(Start, SizeOf(Vector3));
    						f.ReadBuffer(Finish, SizeOf(Vector3));
    						f.ReadBuffer(MusicPath, 255);
    					end; // end with
    			end; // end while
    		Result := true;
    	end
    else
    	begin
    		MessageDlg('Erreur ce n''est pas un fichier map.', mtError, [mbOk], 0);
    		Result := false;
    	end;
     finally
          // Libération du fichier
          f.free;
        end; // try.. finally
      except
    // Traitement des exceptions
    Result := False;
     on EInOutError do
       begin        
         MessageDlg('Erreur d''E-S fichier.', mtError, [mbOk], 0);
       end;
     on EReadError do
       begin
          MessageDlg('Erreur de lecture sur le fichier.', mtError, [mbOk], 0);
       end;
    else
    begin
    	MessageDlg('Erreur sur le fichier.', mtError, [mbOk], 0);
    end;
    end; // try..except
    end;
    Le problème c'est qu'il me pète encore une erreur sur les ReadBuffer :

    [Pascal Error] Creator.pas(105): E2250 There is no overloaded version of 'ReadBuffer' that can be called with these arguments.
    Vous avez une idée ? Je seche depuis quelques heure et c'est assez prise de tête.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Points : 12
    Points
    12
    Par défaut
    J'ai compris mon erreur (pour ceux que ca interesse !).
    Les types reconnus pas ReadBuffer et WriteBuffer sont très limités. Donc en particulier pas de tableaux, par de Vector3, etc... donc il faut tout décomposer apparemment !
    Merci de votre aide à tout le monde (surtout la source de developpez.com qui parle très bien des TFileStream : http://flash-koti.developpez.com/art...4-tfilestream/).

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 707
    Points : 25 589
    Points
    25 589
    Par défaut
    C'est ce que je soulignais dans le tutoriel de Nono40

    Comme la lecture globale n'est plus autorisée
    Ce qui est bien long et fastidieux, donc je te conseille de faire une classe TMapReader qui encapsule les méthodes de lecture et d'écriture dans un stream pour éviter la redondance et faciliter la maintenance du code ... je te conseille aussi de faire un TVector3Reader ...

    juste une étrangeté, ton fichier contient qu'un seul record, car sinon, tu ne prend que le dernier ... autant vérifier la taille avant de lancer la procédure de lecture ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec la gestion des fichier dans une JList()
    Par chebmo1986 dans le forum Composants
    Réponses: 3
    Dernier message: 19/02/2009, 00h49
  2. [POI] Problème de lecture des fichiers Word
    Par Dari dans le forum Documents
    Réponses: 9
    Dernier message: 05/07/2007, 15h08
  3. Gestion des fichiers
    Par roger12 dans le forum Administration système
    Réponses: 2
    Dernier message: 19/10/2005, 10h01
  4. [HTML] Problème mise à jour des fichiers en cache
    Par El Riiico dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 05/09/2005, 18h00
  5. Problème pour Télécharger des fichiers
    Par joce3000 dans le forum C++Builder
    Réponses: 8
    Dernier message: 21/01/2005, 11h30

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