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

Pascal Discussion :

Copier le contenu d'un fichier dans un autre


Sujet :

Pascal

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut Copier le contenu d'un fichier dans un autre
    bonjour, je veux creer un programme qui supprime les chaines de caracteres dupliquer dans un fichier.
    exemple :
    fichier d'origine :.........................................2em fichier {modifiier} :
    - george....................................................- george
    - michael...................................................- michael
    - johana....................................................- johana
    - george....................................................- jack
    - jack........................................................- kami
    - kami
    - michael

    voila mon code jespere que vous trouverez le probleme pour m'aider.

    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
    program contact;
     
    uses fdelay,crt;
    type tfile = file of string;
     
     
    procedure copy_f(nom1,nom2:string);
    var f1,f2 : tfile;
        i,r,mok : integer;
        x,y : string;
    begin
         {$I-}
         assign(f1,nom1);
         assign(f2,nom2);
         reset(f1);
         rewrite(f2);
         {$I+}
         if ioresult<>0 then begin
                                  writeln('erreur');
                                  writeln('taper une touche pour quitter');
                                  halt(1);
                        end;
         {for i:=0 to taille-1 do}
         i:=0;r:=0;
         while not EOF(f1) do
         begin
            {  seek(f1,i);    }
              seek(f1,r);
              read(f1,x);
              r:=i;
              while not EOF(f1) do
              begin
                   seek(f1,i+1);
                   read(f1,y);
                   if (x=y) then mok:=1;
                   i:=i+1;
              end;
              if (mok=0) then write(f2,x);
              mok:=0;
              r:=r+1;;
         end;
         close(f1);close(f2);
    end;
     
    begin
     
    copy_f('c1','c2');
     
    end.

  2. #2
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    1) Quel est ton problème ?
    2) Le traitement doit-il se faire sur fichier (gros fichier) ou peut-on supposer que le contenu peut être chargé en mémoire ?

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Hak,

    Premier problème qui saute aux yeux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type tfile = file of string;
    Pascal a un type générique pour les fichiers texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    var
      f1,f2 : Text;
    Eh oui, aussi simple que ça.

    Sinon, +1 sur CapJack

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par CapJack
    1) Quel est ton problème ?
    2) Le traitement doit-il se faire sur fichier (gros fichier) ou peut-on supposer que le contenu peut être chargé en mémoire ?
    oui le traitement doit ce faire sur un gros fichier.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par droggo
    Hak,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    var
      f1,f2 : Text;
    Eh oui, aussi simple que ça.
    désolé c'est pas aussi simple que ca, ca marche pas.

  6. #6
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Que contient le fichier c1, et comment a-t-il été créé ?

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par CapJack
    Que contient le fichier c1, et comment a-t-il été créé ?
    le fichier 'C1' a etais creer par moi, je l'ai creer sans extension, et il est rempli de quelque nom comme ceux que j'ai mit en exemple, mais y'a aussi des caracteres speciaux comme : ['@','[',']',....].

  8. #8
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Tu l'as créé en Pascal, de type file of string, et il n'est pas lisible dans un éditeur de texte ? C'est bien ça ?

  9. #9
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par CapJack
    Tu l'as créé en Pascal, de type file of string, et il n'est pas lisible dans un éditeur de texte ? C'est bien ça ?
    j'ai pas bien compris ce que tu veux dire, mais je l'ai creer sans extension et quand je veux le remplir je l'ouvre avec le bloc-notes, je suis pas fort dans les fichiers, alors si y'a meme une moyen pour changer le fichier au lieu de sans extension, mettre un fichier text, je suis tout a fait d'acord

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    voila j'ai changer un peu le code :
    et j'ai indiquer le probleme.
    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
    program contact;
     
    uses fdelay,crt;
    type tfile = file of string;
     
     
    procedure copy_f(nom1,nom2:string);
    var f1,f2 : tfile;
        i,r,mok : integer;
        x,y : string;
    begin
         {$I-}
         assign(f1,nom1);
         assign(f2,nom2);
         reset(f1);
         rewrite(f2);
         {$I+}
         if ioresult<>0 then begin
                                  writeln('erreur');
                                  writeln('taper une touche pour quitter');
                                  halt(1);
                        end;
         {for i:=0 to taille-1 do}
         r:=0;
         while not EOF(f1) do
         begin
            {  seek(f1,i);    }
              seek(f1,r);
              read(f1,x);  { <================= voila ou il se plonte }
              i:=r+1;
              while not EOF(f1) do
              begin
                   seek(f1,i);
                   read(f1,y);
                   if (x=y) then mok:=1;
                   i:=i+1;
              end;
              if (mok=0) then write(f2,x);
              mok:=0;
              r:=r+1;;
         end;
         close(f1);close(f2);
    end;
     
    begin
     
    copy_f('c1','c2');
     
    end.

  11. #11
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Je vais essayer d'expliquer : déjà, pour commencer, on se fiche complètement de l'extension d'un fichier, ce n'est qu'une convention pratique, ce n'est pas en changeant l'extension d'un fichier qu'on modifie son contenu.

    Ensuite, en Pascal, quand tu déclares un fichier de type file of..., il s'agit d'un fichier contenant des éléments de taille fixe. Dans le cas de file of string pour Turbo Pascal, les éléments en question seront des blocs de 256 octets, un octet pour la longueur, et 255 octets pour chaque chaîne, tous n'étant pas forcément significatifs. Un tel fichier ne peut en aucun cas être créé par un éditeur de texte, bloc-notes ou autre ! En effet, pour que le fichier soit correctement lu, il faut que les chaînes, ou les "lignes" si tu préfères, soient à des positions régulières dans le fichier (tous les 256 octets), ce qui est impossible à faire avec un éditeur de texte.

    Or :

    Citation Envoyé par moncef357
    quand je veux le remplir je l'ouvre avec le bloc-notes
    Donc, ça ne va pas du tout !!! droggo a raison dans ce cas : il faut utiliser le type text, et pas file of string. Dans le type text, les lignes sont séparées par des retours chariot, et seuls les caractères de la chaîne sont présents. Encore une fois ça n'a strictement rien à voir avec l'extension du fichier, mais ta façon de procéder ne pourra en aucun cas être utilisée pour un fichier de type text. En fait, tu as complètement confondu deux types de fichier complètement incompatibles.

    Je te conseille déjà de bien étudier ce tutoriel :
    http://cyberzoide.developpez.com/info/turbo/chap10.php3

    Ensuite, il faudra, soit que tu crées ton fichier de type file of string par programme, c'est la seule méthode, soit que tu reprennes tout à zéro car la fonction Seek ne peut pas être utilisée sur un fichier de type text. Ici, tu lui demandes d'aller lire des informations bien au-delà de la fin du fichier !!!

    Edit : sinon ton algorithme a l'air bon, à un détail près : il faut mettre mok := 0 avant la boucle, pas après !

    Edit2 : non, je viens de tester, ça ne marche pas ; en effet, comme la petite boucle va jusqu'au bout du fichier, la grande croit que c'est fini (condition EOF remplie) !

  12. #12
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    Citation Envoyé par CapJack
    il faut mettre mok := 0 avant la boucle, pas après !
    ben je pense que cest la meme chose, le plus important cest initialiser mok a 0 avant de tourner la boucle

    pour le tutoriel je vais lire, et j'espere arriver a quelque chose, sinon j'espere aussi que vous m'aidier a resoudre le probleme.

  13. #13
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    j'ai oublie d'ajouter un truc, je peux pas remplir le fichier a partir de pascal, parce que c'est ultra long, je dois ecrire des millier de nom tu vois ce que je veux dire, alors c'est facile de mettre copier coller du bloc-notes

  14. #14
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Citation Envoyé par moncef357
    ben je pense que cest la meme chose, le plus important cest initialiser mok a 0 avant de tourner la boucle
    Oui, mais il faut penser à la première boucle. De toute façon, l'algorithme ne va pas.

    Citation Envoyé par moncef357
    j'ai oublie d'ajouter un truc, je peux pas remplir le fichier a partir de pascal, parce que c'est ultra long, je dois ecrire des millier de nom tu vois ce que je veux dire, alors c'est facile de mettre copier coller du bloc-notes.
    Je comprends parfaitement, et d'ailleurs plus personne n'utilise le type file of string à notre époque : outre que c'est peu pratique, ça gaspille inutilement de la place.

    Bien, je dois vous quitter, peut-être à demain. Voici un code complet, corrigé qui fonctionne avec le type file of string. Comme tu le verras, la variable i était en réalité inutile, et du coup l'adaptation à un fichier de type text devrait être facilitée.

    Bonsoir.

    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
    74
    75
    76
    77
    78
    79
    program contact;
     
    uses crt;
    type tfile = file of string;
     
     
    procedure copy_f(nom1,nom2:string);
    var f1,f2 : tfile;
        r,mok : integer;
        x,y : string;
    begin
         {$I-}
         assign(f1,nom1);
         assign(f2,nom2);
         reset(f1);
         rewrite(f2);
         {$I+}
         if ioresult<>0 then begin
                                  writeln('erreur');
                                  writeln('taper une touche pour quitter');
                                  halt(1);
                        end;
         {for i:=0 to taille-1 do}
         r:=0;
         while not EOF(f1) do
         begin
              read(f1,x);
              mok:=0;
              while not EOF(f1) do
                  begin
                   read(f1,y);
                   if (x=y) then
                      begin
                       mok:=1;
                       break;
                      end;
                  end;
              if (mok=0) then write(f2,x);
              r:=r+1;
              seek(f1,r);
         end;
         close(f1);close(f2);
    end;
     
    procedure creer_f(nom:string);
    var f1:tfile;s:string;
    begin
     assign(f1,nom);
     rewrite(f1);
     s := 'georges';write(f1,s);
     s := 'michael';write(f1,s);
     s := 'johana'; write(f1,s);
     s := 'georges';write(f1,s);
     s := 'jack';   write(f1,s);
     s := 'kami';   write(f1,s);
     s := 'michael';write(f1,s);
     close(f1);
    end;
     
    procedure lire_f(nom:string);
    var f1:tfile;s:string;
    begin
     assign(f1,nom);
     reset(f1);
     while not (eof(f1)) do
      begin
       read(f1,s);
       writeln(s);
      end;
     close(f1);
    end;
     
    begin
     clrscr;
     creer_f('c1');
     copy_f('c1','c2');
     lire_f('c2');
     readln
    end.

  15. #15
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    oui j'ai compris le truc, mais faut vrement m'aider a trouver une solution pour pouvoir remplir le fichier moi meme, je pense que t'est deja parti, j'espere que demain tu me trouvera une solution si je la trouve pas moi aujourd'hui.

  16. #16
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Bon, j'ai réfléchi un peu... faire un filtrage directement sur un fichier texte avec une version 16 bits de Pascal me semble un peu sportif.

    Compte tenu du travail effectué, je te propose la solution suivante : tu écris une procedure pour convertir dans un premier temps le fichier texte d'entrée (ou fichier "bloc-note" pour bien se comprendre) en fichier temporaire file of string.

    Ensuite, dans la procédure de filtrage, tu injectes le fichier temporaire, et les modifications à effectuer pour récupérer un fichier texte sont minimes : déclarer f2 de type text, remplacer write(f2,s) par writeln(f2,s).

    Enfin, ne laisse pas file of string ! Comme expliqué, dans un tel fichier, chaque chaîne occupe inutilement 256 octets ; avec plusieurs milliers de lignes tu vas te retrouver avec un fichier énorme. S'il s'agit de prénoms, je suppose qu'on peut limiter à 30 caractères ou moins !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type prenom = string[30]
           tfile = file of prenom
    Et remplacer string par prenom pour les variables servant au transfert (celles qui provoqueront l'erreur "type mismatch").

  17. #17
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    ben merci, j'ai oublié de mentionné que j'ai trouvé hier la solution
    bon je pose mon code final ou cas ou quelqu'un a le meme probleme que 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
     
    Program tri ;
     
    Uses fdelay, crt, dos ;
     
    Var f,f2 : Text ;
        nom,x,y : String ;
        choix : Char ;
        r,i,mok : integer;
     
    BEGIN
         ClrScr ;
         Assign(f, 'init.txt') ;
         Reset(f) ;
         assign(f2, 'iniii.txt');
         rewrite(f2);
     
         while not seekeof(f) do
         begin
                readln(f,x);
                reset(f2);
              while (not seekeoln(f2)) and (mok:=0) do
              begin
                        readln(f2,y);
                   if (x=y) then mok:=1;
              end;
              append(f2);
              if (mok=0) then writeln(f2,x);
              mok:=0;
         end;
         close(f);
         close(f2);
    writeln('Tri terminé!!');
    writeln('Appuyer sur entrer pour sortir');
    readln;
    END.

  18. #18
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Super ! Par contre, c'est évidemment plus lent qu'avec un fichier typé, mais pas sûr que ce soit sensible... content pour toi.

    Edit : sauf que ça, ça m'étonnerait que ça marche. Sûr d'avoir testé le code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
              while (not seekeoln(f2)) and (mok:=0) do

  19. #19
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Goh,
    Citation Envoyé par moncef357
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
         while not seekeof(f) do
         begin
                readln(f,x);
                reset(f2);
              { je vois un problème sur la ligne suivante }
              while (not seekeoln(f2)) and (mok:=0) do
    ...
    Le problème est l'utilisation d'une variable non initialisée, avec en plus l'utilisation de l'opérateur d'affectation := au lieu de celui de comparaison =.
    Normalement, le compilateur a dû donner au moins un warning, mais ça dépend bien sûr du compilateur.

    Même si éventuellement le compilateur garantit que cette variable vaudra 0, ce qui n'est pas le cas pour tous (aucun ?), il faut éviter ça.

    C'est une des règles à suivre : Ne jamais utiliser une variable non initialisée.

  20. #20
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    Déjà dit pour la première version, mais il ne tient pas compte des remarques.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. copier le contenu d'un fichier dans un autre en précisant ou
    Par makaphrodite dans le forum Langage
    Réponses: 8
    Dernier message: 04/11/2010, 16h32
  2. Réponses: 2
    Dernier message: 27/04/2009, 23h14
  3. copier le contenu d'un fichier dans un autre avec séparateur
    Par sws2008 dans le forum Scripts/Batch
    Réponses: 0
    Dernier message: 03/12/2008, 09h56
  4. Réponses: 4
    Dernier message: 28/08/2007, 17h11

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