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 :

write en fichier d'integer


Sujet :

Delphi

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Par défaut write en fichier d'integer
    salut,
    alors j'ai un fichier d'integer ( bestand14) de type .dat et j'utilise pour le moment, pour entrer les données dan le fichier, "write". Mais Quand je les relis, le programme ne reprend pas les toutes derniers info donc il faudrait que je travaille avec "writeln". Mais quand je met "writeln" le programme me met la faute "Illegal type in write/writeln statement". Alors je ne sais pas comment je dois faire pour arriver a ce que cel marche!!?? Pourriez vous m'aider?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     AssignFile(Bestand14,'C://LeeftijdKinderenKinderenen.dat');
     Rewrite(Bestand14);
     AantalKinderen := StrToInt(FormGrootOuders.EditKeuze1.Text);
     SetLength(JaarOuders,AantalKinderen);
       For teller := 0 to (AantalKinderen-1) do
        begin
          Write(Bestand14,JaarOuders[teller].LeeftijdOudersMoeder);
        end;
    CloseFile(Bestand14);

  2. #2
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Salut,

    Tout d'abord, pour ta dernière remarque, writeln ne s'applique qu'à des fichiers de type Text (ceux déclarés par la type Text tout simplement)


    Par contre je ne suis pas bien sur de tout comprendre à ton soucis. Est-ce que tu peux mettre un peu plus de ton code, notamment al partie des type et de tes variables ? Je pourrais peut-être t'aider ...

  3. #3
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Bonjour.

    Dans ton code, tu écrit toutes tes données à la queu-leuleu.

    WriteLn est utilisé pour les chaines de caractères (fichier texte).

    Dans ce cas le code doit ressemler à ceci :
    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
    Var
       Valeur        : Integer;
       Bestand14 : TextFile;
     
    begin
     
     
    AssignFile(Bestand14,'C://LeeftijdKinderenKinderenen.dat');
     Rewrite(Bestand14);
     AantalKinderen := StrToInt(FormGrootOuders.EditKeuze1.Text);
     SetLength(JaarOuders,AantalKinderen);
       For teller := 0 to (AantalKinderen-1) do
        begin
             Valeur := JaarOuders[teller].LeeftijdOudersMoeder;
              WriteLn(Bestand14,IntToStr(Valeur));
        end;
    CloseFile(Bestand14);

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 21
    Par défaut
    En faite je mes plusieurs donné dedans comme celle ci aussi, et auparavant j'ai été obligé d'utiliser un fichier d'integer car quand je relisait les données il me mettait un erreur. Et maintenant ca marche mais il n'arrive pas à lire les dernieres données dans "JaarKleinKinderen1[x].LeeftijdKleinKinderen1[teller1])"

    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
     
     
    type
     TLeeftijd5 = Record
      LeeftijdKleinKinderen1 : Array of Integer;
    end;
     TJaarKleinKinderen1 = Array of TLeeftijd5 ;
     
    var
     Bestand14 : File of Integer;
    JaarKleinKinderen : TJaarKleinKinderen;
     
    Procedure
     
     AssignFile(Bestand14,'C://LeeftijdKinderenKinderenen.dat');
     Rewrite(Bestand14);
     AantalKinderen := StrToInt(FormGrootOuders.EditKeuze1.Text);
      SetLength(JaarKleinkinderen1,AantalKinderen);
      x := 0;
      y := 0;
     
      Repeat AantalKinderen1 := KleinKinderen1[x].HoeveelKleinKind1;
             SetLength(JaarKleinKinderen1[x].LeeftijdKleinKinderen1,AantalKinderen1);
             For teller1 := 0 to (AantalKinderen1-1) do
              begin
               Write(Bestand14,JaarKleinKinderen1[x].LeeftijdKleinKinderen1[teller1]);
              end;
              x := x+1;
              y := y+1;
      Until y = AantalKinderen;
     CloseFile(Bestand14);
    et je relis les info avec :
    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
     
      AssignFile(Bestand14,'C://LeeftijdKinderenKinderenen.dat');
      Reset(Bestand14);
      SetLength(JaarKleinkinderen1,AantalKinderen);
       x := 0;
       y := 0;
     
       Repeat AantalKinderen1 := KleinKinderen1[x].HoeveelKleinKind1;
           SetLength(JaarKleinKinderen1[x].LeeftijdKleinKinderen1,AantalKinderen1);
           For teller1 := 0 to (AantalKinderen1-1) do
            begin
             Read(Bestand14,JaarKleinKinderen1[x].LeeftijdKleinKinderen1[teller1])
            end;
            x := x+1;
            y := y+1;
       Until y = AantalKinderen;
    CloseFile(Bestand14);
    Je fais en sorte que le dernier "aantal kinderen" soit egal au premier. Ca ca marche.
    PS : Désolé pour les code en néerlandais mais je suis à l'unif en néerlandais et je dois faire un programme et le présenter.

  5. #5
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Le problème vient du fait que tu utilises des tableaux dynamiques pour la structure (Record) et pour écrire et lire ton fichier.
    Les nombres déléments (ou les longueurs) ne sont pas connues au moment de la lecture. Donc, impossible pour le systeme de connaitre correctement le nombre de données à lire.

    Utilise des tableaux de longueur définit pour la structure. Je suis même étonné que le compilateur ne te signales pas une erreur.

    A+

  6. #6
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Simple suggestion :
    Au lieu de faire un file of integer, tu ne peux pas faire un fichier de type celui que t'a créé et en fait tu enregistre le tableau complet directement ....

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    type TMonType = Record
              Mon_Tableau : array of array of integer;
             End;
     
    var F : File of TMonType;
         Tab : TMonType;
    ...
    Write(F,Tab);
    Je ne sais pas si ça peut marcher comme ça où si dans ton projet ça peut s'intégrer (tout dépend des contraintes que tu as ...)

  7. #7
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut


    Non ! Ca ne marchera pas car le compilateur refusera la structure de dimension inconnue pour le type fichier.
    Il y aura imencablement un code d'erreur 28 donné par le complilateur.
    Pour pouvoir enregistrer une structure (record) dans un fichier, il est impératif que sa dimention soit connue et fixe. Donc un type de tableau dynamique (Array Of Integer ou Array Of Array Of Integer) n'a pas de dimension du tout au moment de la compilation.

    Par contre, un fichier de type texte peut convenir tout à fait. C'est bien ce que l'on fait avec un fichier tableur comme le type CSV.

    A+

  8. #8
    Membre Expert 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

  9. #9
    Membre Expert 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
    Par défaut
    voila un petit example avec blockread et blockwrite: (pour D6 et>)
    2 listebox et 2button
    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
     
    //pour ecrire
    procedure TForm1.Button1Click(Sender: TObject);
    var
        f:File of byte;
        i,j,n:Integer;
        t:array of PIntegerArray;
    begin
         ListBox2.Clear;
         setlength(t,100);
         assignfile(f,'c:\tata.edam');
         rewrite(f);
         for i:=0 to 100-1 do
           begin
             getmem(t[i],50*4);
             for n:=0 to 50-1 do
               begin
                t[i,n]:= Trunc(random($FFFFF));
                ListBox2.Items.Add(inttostr(t[i,n]));
               end;
             BlockWrite(f,t[i]^,50*4,j);
             application.ProcessMessages;
           end;
         for i:=0 to 100-1 do
           begin
             FreeMem(t[i]);
           end;
         closefile(f);
    end;
    //pour lire
    procedure TForm1.Button2Click(Sender: TObject);
    var
        f:File of byte;
        i,j,n:Integer;
        t:array of PIntegerArray;
    begin
         setlength(t,100);
         assignfile(f,'c:\tata.edam');
         {$i-}
         reset(f);
         if ioresult<>0 then exit;
         ListBox1.Clear;
         i:=0;
         repeat
             getmem(t[i],50*4);
             BlockRead(f,t[i]^,50*4,j);
             for n:=0 to 50-1 do
                ListBox1.Items.Add(inttostr(t[i,n]));
             inc(i);
             application.ProcessMessages;
         until (j=0) or (i>=100);
         for i:=0 to 100-1 do
           begin
             FreeMem(t[i]);
           end;
         closefile(f);
    end;

  10. #10
    Membre éclairé
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Par défaut
    Citation Envoyé par Philippe Gormand


    Non ! Ca ne marchera pas car le compilateur refusera la structure de dimension inconnue pour le type fichier.
    Il y aura imencablement un code d'erreur 28 donné par le complilateur.
    Pour pouvoir enregistrer une structure (record) dans un fichier, il est impératif que sa dimention soit connue et fixe. Donc un type de tableau dynamique (Array Of Integer ou Array Of Array Of Integer) n'a pas de dimension du tout au moment de la compilation.

    Par contre, un fichier de type texte peut convenir tout à fait. C'est bien ce que l'on fait avec un fichier tableur comme le type CSV.

    A+
    Justement c'était un peu le but de ma réponse, savoir si c'était possible ou pas étant tombé une fois sur ce problème de dimension mais pour des string (j'avais trouvé la solution y'a aps de soucis).
    Je risque de m'égarer un peu mais alors dans ce cas là, on ne peux pas enregistrer des tableaux comme ça directement dans un fichier ? (autre que texte)

  11. #11
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut

    Bleys a écrit :

    Je risque de m'égarer un peu mais alors dans ce cas là, on ne peux pas enregistrer des tableaux comme ça directement dans un fichier ? (autre que texte)
    Ce que j'ai voulu dire, c'est que ta solution proposée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <div style="text-align: left;">type TMonType = Record
              Mon_Tableau : array of array of integer;
             End;
     
    var F : File of TMonType;
         Tab : TMonType;
    ...
    Write(F,Tab);</div>
    Ne marcherait pas. J'ai suggéré un fichier de type texte simplement comme exemple des fichiers CSV. Je n'avais pas le temps de me pencher d'avantage sur le problème de tchouk.
    La solution a été apporté par edam. C'est une des méthodes que j'utilise pour écrire ce genre de fichiers. Il y en a bien d'autres, et je souhaitais que tchouk cherche un peu plus, mais bon...

    Attention : Dans la méthode de edam qui utilise des tableaux dynamiques, il faut le la dimention du tableau suivant chaque "BlockRead" soit connu à la lecture.
    J'ai commencé un tutoriel sur l'utilisation des structures et fichiers séquenciels, mais il faudra attentre un peu.

    A+

  12. #12
    Membre Expert 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
    Par défaut
    Citation Envoyé par Philippe Gormand
    Attention : Dans la méthode de edam qui utilise des tableaux dynamiques, il faut le la dimention du tableau suivant chaque "BlockRead" soit connu à la lecture.
    A+
    pas n'ecessaireemnt si tu enregistre dans le fichier la taille de chaque block soit tu fait comme (bmp) tt les renseignement dans un seul block au début de fichier soit avant chaque blockwrite
    a toi de normalisé votre méthode d'ecriture et lecture

  13. #13
    Membre chevronné
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Par défaut
    Mon cher edam, c'est exactement ce que je voulais dire.
    pas n'ecessaireemnt si tu enregistre dans le fichier la taille de chaque block soit tu fait comme (bmp) tt les renseignement dans un seul block au début de fichier soit avant chaque blockwrite
    a toi de normalisé votre méthode d'ecriture et lecture
    Mon tutoriel en parlera.

    A+

  14. #14
    Membre Expert 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
    Par défaut

Discussions similaires

  1. Read et write un fichier avec Fortran
    Par jill_ dans le forum Fortran
    Réponses: 7
    Dernier message: 07/01/2013, 18h34
  2. [bean:write][Integer] comment l'écrire ?
    Par Invité dans le forum Struts 1
    Réponses: 1
    Dernier message: 28/04/2006, 14h46
  3. Problème avec write sur fichier
    Par telescan dans le forum Linux
    Réponses: 8
    Dernier message: 13/12/2005, 16h09
  4. [c#][fw2.0]last write acces d'un fichier
    Par the_bmo dans le forum C#
    Réponses: 2
    Dernier message: 05/12/2005, 16h22
  5. [Fichiers] BlockRead/Write et les Strings
    Par Clorish dans le forum Langage
    Réponses: 5
    Dernier message: 14/01/2005, 21h28

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