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 :

Enregistrement d'un tableau (array) dans un fichier texte


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut Enregistrement d'un tableau (array) dans un fichier texte
    Voila, je me demande quelle est la méthode pour enregistrer les valeurs d'un tableau du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab:Array[1..100] of intenger;
    dans un fichier texte sur une ligne du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Writeln(F,IntToStr(tab[1]),IntToStr(tab[2]),.......);
    D'une part, la longueur et d'autre part le nombre d'index du tableau n'est pas forcement le maxi déclaré

    Je suppose qu'il faut placer une boucle for mais où, comment ?

    Merci d'avance

  2. #2
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Bonjour,

    si vous n'utilisez pas toujours les 100 items de votre tableau, utilisez un tableau dynamique

    tab : Array of integer;

    attention, il faudra gérer vous même la longueur à l'aide de la fonction setlength


    Autre point : vous commencez le tableau à l'index 1. en général, sous delphi, les tableaux commencent à l'index 0 (ce serait le cas avec un tableau dynamique)


    au niveau de la boucle, utilisez un string que vous remplissez et que vous recopierez ensuite.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Var
      Index : Integer;
      S : String;
    begin
    .
    .
      S := ''; // initialise le string;
      For Index := 1 to 100 do
        S := S + IntToStr(Tab[Index];
      Writeln(F, S);
    Attention, les valeurs 1 et 100 de la boucle sont explicitement celles de votre tableau.

    Par contre, dites ce que vous comptez en faire : laà vous allez obtenit une suite de chiffres (si vos valeurs sont des nombres à plusieurs chiffres, il sera impossible de savoir ou ils commencent à la lecture). il faut peut être prévoir des séparateurs.

  3. #3
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Writeln écrit et passe à la ligne, pour ne pas passer à la ligne, il faut utiliser Write tout court !

    Ainsi, pour ce qui t'intéresse, vous devrez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I]);
    end;
    celà écrira tous les éléments du tableau sur la même ligne (sans espace qui les sépare)

    Dans le cas ou vous souhaitez rajouter un espace derrière chaque élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I],' ');
    end;
    Vous pouvez terminez l'écriture dans le fichier avec un saut de ligne supplémentaire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I],' ');
      writeln(F);
    end;
    Bon codage
    Bidouilleuse Delphi

  4. #4
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par waskol
    Writeln écrit et passe à la ligne, pour ne pas passer à la ligne, il faut utiliser Write tout court !

    Ainsi, pour ce qui t'intéresse, vous devrez écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I]);
    end;
    celà écrira tous les éléments du tableau sur la même ligne (sans espace qui les sépare)

    Dans le cas ou vous souhaitez rajouter un espace derrière chaque élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I],' ');
    end;
    Vous pouvez terminez l'écriture dans le fichier avec un saut de ligne supplémentaire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Var
      I : Integer;
    begin
    ...
    ...
      for I := 1 to 100 do Write(F, tab[I],' ');
      writeln(F);
    end;
    Bon codage
    Le code est peut être correcte mais si t'as 1000 elements tu vas ecrire milles fois sur disque.
    Pourquoi ne pas utiliser une variable temporaire, construire la ligne à ecrire et ensuite ecrire une fois sur disque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Var
      I : Integer;
      StrTemp : String;
    begin
    ...
    ...
      StrTemp := ''; 
      for I := 1 to 100 do 
      StrTemp := StrTemp + ' '+ tab[i] ;
      Writeln(F, StrTemp);
    end;
    A+
    On progresse .....

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 71
    Points : 50
    Points
    50
    Par défaut
    Oui, cela correspond à ce bjl a écrit, et c'est exactement ce que je souhaitais faire, en prenant soin de mettre un ';' en 2 données, ce qui me permet d'écrire par la suite le même type de données en dessous (le tout sera exploité par excel)
    Par contre, j'ai eu plus de difficuté pour gérer le tableau dynamique mais avec l'embryon d'information et la recherche sur 'developpez.com' je pense avoir une solution correcte.
    Ci après cette solution .Je la mets en réponse (avant de placer un résolu) telle est ma modeste contribution car je trouve ce forum vraiment extra.
    J'en profite pour remercier sincèrement toutes les personnes qui alimentent ce forum en DONNANT (choses rares de nos jours) , de leur temps, et leur aide pour des débutants comme moi.

    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
     Var
    Tab:array of Integer; //déclaré précedemment pour l'alimenter
    F: TextFile;
    ind:integer;
    ligne: string;
    begin
    Ligne:='';   //initialisation de variable ligne
    Ligne:= TimeToStr(Now); //mettre l'heure dans  variable ligne
    setlength(tab,1000);
     For ind:=Low(tab) to High(tab) do
       Ligne:=Ligne+';'+ FloatTostr(tab[ind]);
    if not FileExists(Fich)  then exit;   //contrôle de l'existence du fichier
    Assign(F,Fich);
    Append(F);
    Writeln(F,ligne);  //écrire la ligne variable temporaire dans le fichier à la fin
    Close(F);
    end;
    Encore une fois , un gros MERCI et bonne année à tous

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Salut à tous,
    J'ai beaucoup aimé cette discussion, mais j'ai une préoccupation: comment mettre sur un fichier texte un tableau d'enregistrement?
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                 type Tpersonne=record
           			 nom    :string[20];
          			 pnom   :string[20];
           			 prenom :string[20];
           			 age    :byte;
           			 sexe   :string[10];
          	  		 adresse:string[70];
          			 tel      :extended;
     
     
    		 end;
    Je compte sur vous!

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par masala Voir le message
    Je compte sur vous!
    Bonjour ! C'est gentil de compter sur nous mais il y a des cours sur le sujet : le mieux serait de les consulter.

    http://pascal.developpez.com/cours/c...ge=pg_Fichiers
    http://turbo-pascal.developpez.com/t...anier_fichier/
    http://pascal.developpez.com/exercices/?page=Sect7

    Pour sauvegarder un tableau d'enregistrements dans un fichier, le plus simple est d'utiliser un fichier du type file of MonType. Maintenant si vous voulez un fichier texte, je pense qu'il n'y a pas d'autre solution que d'écrire une à une les données de chaque enregistrement. Un exemple vite fait pour montrer le principe :

    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
    program exemple;
     
    { Écrire et lire un tableau d'enregistrements dans un fichier texte. }
     
    uses
      SysUtils;
     
    type
      TEnreg = record
        i: integer;
        s: shortstring;
      end;
     
    var
      arr: array[0..2] of TEnreg;
      fich: Text;
      index: integer;
     
    begin
      Randomize;
     
      { Remplir le tableau de valeurs aléatoires. }
     
      for index := Low(arr) to High(arr) do
      begin
        arr[index].i := Random(100);
        arr[index].s := 'A' + IntToStr(Random(100));
      end;
     
      { Sauvegarder le tableau dans un fichier texte. }
     
      AssignFile(fich, 'fichier.txt');
      Rewrite(fich);
     
      for index := Low(arr) to High(arr) do
      begin
        WriteLn(fich, arr[index].i);
        WriteLn(fich, arr[index].s);
      end;
     
      { Effacer le contenu du tableau. }
     
      for index := Low(arr) to High(arr) do
      begin
        arr[index].i := 0;
        arr[index].s := '';
      end;
     
      { Recharger le tableau à partir du fichier. }
     
      Reset(fich);
     
      for index := Low(arr) to High(arr) do
      begin
        ReadLn(fich, arr[index].i);
        ReadLn(fich, arr[index].s);
      end;
     
      { Afficher le contenu du tableau. }
     
      for index := Low(arr) to High(arr) do
      begin
        WriteLn(arr[index].i);
        WriteLn(arr[index].s);
      end;
     
      CloseFile(fich);
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Juste une petite remarque ... 10 ans après.
    Les tableaux sont contigus en mémoire, donc on peut écrire tout d'un seul bloc, en utilisant un TFileStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      f: TFileStream;
    begin
      f := TFileStream.Create(AFilename, fmCreate or fmShareExclusive);
      f.write(ATab[0], Length(ATab) * SizeOf(ATab[0]));
      f.Free;

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Juste une petite remarque ... 10 ans après.
    Les tableaux sont contigus en mémoire, donc on peut écrire tout d'un seul bloc, en utilisant un TFileStream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
      f: TFileStream;
    begin
      f := TFileStream.Create(AFilename, fmCreate or fmShareExclusive);
      f.write(ATab[0], Length(ATab) * SizeOf(ATab[0]));
      f.Free;

    Merci beaucoup!
    j'aimerai apprendre davantage sur le " TFILESTREAM" expliquez-vous un peu bien avec un code plus precis (exemple d'une application banale). le Tfilestream est-il valable pour la version de delphi que j'utilise? je travaille sous Dephi7.
    merci.

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Le filestream est bien dispo en D7.
    l'exemple que je t'ai donné est assez complet, il ne manque pas grand chose. Après la touche F1 t'en dira beaucoup plus.
    Cadeau, un fileStream pour ton 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    type
      Tpersonne=record
        nom    :string[20];
        pnom   :string[20];
        prenom :string[20];
        age    :byte;
        sexe   :string[10];
        adresse:string[70];
        tel      :extended;
      end;
     
      TpersonneDynArray = array of Tpersonne;
     
    ...
     
    procedure SavePersonneArray(const AFilename: string; const AArray: TpersonneDynArray);
    var
      f: TFileStream;
    begin
      f := TFileStream.Create(AFilename, fmCreate or fmShareExclusive);
      f.write(AArray[0], Length(AArray) * SizeOf(AArray[0]));
      f.Free;
    end;
     
    function LoadPersonneArray(const AFilename: string): TpersonneDynArray;
    var
      f: TFileStream;
    begin
      if FileExists(AFilename) then
      begin
        f := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyWrite);
        SetLength(Result, f.Size div SizeOf(TPersonne));
        f.Read(Result[0], Length(Result) * SizeOf(Result[0]));
        f.Free;
      end
      else
        SetLength(Result, 0);
    end;

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2015
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup,
    Je vais l'essayer et de le developper un peu plus. Grace à vous, j'avance petit à petit en delphi.
    Je vous remercie! mais comprenez mon insistance, j'suis encore progr'amateur!!!

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

Discussions similaires

  1. Enregistrer dans fichier texte
    Par doulie dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/07/2011, 12h36
  2. Créer tableau dans fichier texte
    Par Hurricae dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 23/05/2011, 13h42
  3. Ecrire un tableau de cellules dans fichier texte
    Par Vince_14 dans le forum MATLAB
    Réponses: 7
    Dernier message: 15/04/2011, 18h47
  4. [ Vector Fichier ] Vector dans fichier texte
    Par geegee dans le forum Langage
    Réponses: 5
    Dernier message: 21/05/2004, 14h56
  5. Insertion dans fichier texte + rapide que TStringList ?
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 26/02/2004, 12h34

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