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 Pascal Discussion :

[LG]Manipulation de fichiers


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut [LG]Manipulation de fichiers
    Salut 8)
    Voila je cherche une idée de programme qui me permetrais d'apprendre à utiliser et à manipuler des fichiers et qui soit accessible pour un débutant comme moi. (C'est à dire que j'ai 3 semaines de pratique).
    Merci de me donner des pistes.

  2. #2
    tintin22
    Invité(e)
    Par défaut
    Un annuaire telephonique par exemple? où tu stockera les numeros, noms prenoms, adresses , avec des options : recherches, ajout, modification...
    c'est p'tet un peu trop pour commencer , à toi de voir

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Merci pour l'idée.
    J'essaye de finir le morpion que je programme et je m'attele à cet annuaire. Je vous tiendrai au courant en cas de panne
    Bonne Fêtes.

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Comme tu n'as pas encore l'adsl, je vais poster dans le forum plutôt!
    Je ne pourrais pas faire un tutoriel très complet sur la lecture / écriture des fichiers en quelque ligne, surtout que c'est un sujet assez complexe! Je vais donc te donner les grandes lignes, et nous verrons le reste par la suite...

    FICHIER BINAIRE:
    Il sagira ici d'obtenir les données brutes du fichiers (octet=byte). On peut soit lire ces données en bloc, soit les lire une par une. Pour des raisons évidentes, la lecture/écriture par bloc est plus rapide. Voici un exemple de lecture de fichier par bloc de 256 octets. J'utilise dans cet exemple un tableau pour stocker les octets lus, mais l'utilisation d'un pointeur est aussi faisable. Avec TP7, la taille maximale d'un enregistrement a été fixée à 65536 octets (64ko) quelque soit le 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
    Uses Crt,Dos;
     
    Const MaxSize=$100;
    Var F:File;
        FileName:string;
        Buf:array[0..MaxSize-1]of byte;
        FSize,Readed:Longint;
     
    Begin {$I-}
      Assign(F,FileName);
      Reset(F,1);
      FSize:=FileSize(F);
      Repeat
        Blockread(F,Buf,MaxSize,Readed);
        Gotoxy(1,1);  
        if({$I+}IOresult{$I-}<>0)then 
          Writeln('Error read file!')else 
          Writeln('Position: ',FilePos(F)); 
        Delay(100);
      Until(Readed<>MaxSize)or(KeyPressed);
      Close(F);
    End.
    Pour le détail de chaque commande, voir l'aide en ligne du compilateur avant de poser des questions. En ce qui concerne la directive de compilation {I}, elle est utilisée avec la fonction IOResult. {I-} permet d'éviter l'affichage d'erreur d'entrée/sortie. Ces erreurs ne sont pas oubliées, elles sont juste reportées sur le {$I+} suivant. ainsi IOResult devient actif. Pour lire les octets un par un, il faut utiliser Read au lieu de BlockRead, et pour écrire dans le fichier, utiliser Write ou blockWrite.


    FICHIER TYPÉ:
    Un fichier typé permet de définir son contenu comme des variables typées, mais en réalité, un fichier contiendra toujours des octets. Par exemple "File of Longint" contiendra uniquement des Longints. Un Longint est composé de 4 octets (32bits). Un enregistrement sera donc de 4 octets. On trouve toutes sortes de fichiers typés. Voici quelques exemples pris au hasard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var F1:File of Byte;
        F2:File of Word;
        F3:File of Char;
        F4:File of Array[1..5]of Char;
        F5:File of string[3];
    Ces types sont "simples", mais on peut composer ses propres types avec Record... Voici un exemple de lecture d'un fichier typé. TMontype est composé de 2 Longints, et d'un string[10]. La taille (en octet) d'un enregistrement peut-être donnée par la fonction SizeOf:
    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
    Uses Crt,Dos;
     
    Type TMontype=Record
            Left:Longint;
            Right:Longint;
            Name:string[10];
          End;
     
    Var F:File of TMontype;
        FileName:string;
        Unite:TMontype;
        FPos,FSize:Longint;
     
    Begin {$I-}
      Assign(F,FileName);
      Reset(F);
      FSize:=FileSize(F);
      Repeat
        Read(F,Unite);
        FPos:=FilePos(F)); 
        Gotoxy(1,1);  
        if({$I+}IOresult{$I-}<>0)then 
          Writeln('Error read file!')else 
          Begin
           Writeln('Position: ',FPos); 
           Writeln('Left: ',Unite.Left);
           Writeln('Right: ',Unite.Right);
           Writeln('Name: ',Unite.Name);
          End; 
        Delay(100);
      Until(FPos(F)>=FSize Div SizeOf(TMontype))or(KeyPressed);
      Close(F);
    End.
    Pour aller plus loin, il est possible d'intégrer ses types perso à l'intérieur d'autre type, etc...
    Mais là n'est pas le sujet du topic. Pour ton projet d'annuaire, l'utilisation de fichier typé est l'idéal, à+

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Salut
    J'ai compris en theorie( reste à pratiquer) et je comprend un peu mieux les fichiers typé et leur utilité pour mon annuaire.
    Mais j'ai une question à propos de IOresult.
    Pourquoi {I-} n'est pas avant [I+} puisqu' il desactive le controle des E/S. :
    Et puis j'avais pas pensé à utiliser l'aide de TP7 Et pourtant c'est très utile.
    Merci et à+

  6. #6
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    La directive {$I} est à {$I-} par défaut, donc il n'y a pas contrôle des erreurs par défaut. {$I+} permet de mettre en marche le contrôle des erreurs !
    a+

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Bonjour,
    J'ai tapé le code ci dessus sur les fichiers binaires. J'ai du changer Fsize et readed en integer (car ca compilait pas) et j'ai rajouter un ClrScr après le begin. Or Rien ne se passe quand le prog tourne alors que je devrait avoir la position si j'ai bien compris(si il ya pas d'erreur de lecture de fichier)
    Bonne Année et à+

  8. #8
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Est-ce que le fichier que tu ouvres existe au moins ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    Je comprend pas.
    Quand je declare le F comme file. Ca cree un fichier qui est vide :
    faut il le remplir de données pour que le prog donne la position?
    Et comment le remplir :

  10. #10
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Raaa là là. Worm débloque encore !

    Voilà un petit extrait d'un fichier d'aide bien connu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      $I:  Input/Output-Checking Switch
      ___________________________________
     Enables or disables the automatic code generation that checks the result of
     a call to an I/O procedure.
     
        Syntax:        {$I+} or {$I-}
        Default:       {$I+}
        Type:          Local
        Menu Command:  Options|Compiler|I/O Checking
    Donc, par défaut, la détection des erreurs E/S est activée !

    De plus, il est, excuse-moi Sub0, grotesque de réactiver la détection des erreurs E/S pour lire le statut de IOResult, qui ne ait que renvoyer la valeur de la variable InOutRes de l'unité System

    En ce qui concerne Yffick : si tu as déclaré ton fichier comme file, à savoir un fichier non-typé, prend bien garde à utiliser le paramètre facultatif de Reset et Rewrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Reset(f, 1);  ou  Rewrite(f, 1);
    Il permet de spécifier la taille des données à lire dans le fichier. Généralement, on lit des octets ! D'où le 1...

    A+

  11. #11
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Pardon, pardon, je suis pas en forme en ce moment

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    B.A. & M.V.!

    Pour info, avec Delphi, on n'est plus limité à un buffer de 64ko!
    On peut aussi copier par bloc avec Read et Write, mais pas au delà de 64 ko (avec TP du moins).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Type Tbuf=Record 
          dat:Array[0..MaxSize-1]of Byte;
         End;
    Var F:File of Tbuf;
    grotesque de réactiver la détection des erreurs E/S
    Si tu le dis...
    Seulement, j'ai toujours vu que l'on utilisait comme cela (avec des variantes des fois).
    Autrement, il me semble qu'il existe la fonction DosError, capable aussi de détecter les erreurs d'E/S.

    à+

  13. #13
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    DosError renvoie le numéro de l'erreur DOS ! IOresult renvoie le numéro de l'erreur d'entrée/sortie ...

  14. #14
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    IOResult est spécifique à TP, qui enregistre seul les éventuelles erreurs, et bloque toutes les opérations d'entrée/seortie tant que sa valeur n'est pas nulle (tant qu'on ne l'a pas consultée).

    DosError est interne au Dos, et ne bloque en aucun cas les opérations d'E/S. Les erreurs peuvent donc se multiplier et les nouvelles effacent les anciennes.

    Quant à IOResult, pour revenir dessus, elle est déclarée comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    GetIORes:
     
    	XOR	AX,AX
    	XCHG	AX,InOutRes
    	RETF
    Aucun risque donc ! Que l'on soit en $I+ ou $I-, le résultat sera le même.

    A+

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    bonjour,
    voila pour mon annuaire, je seche sur quelque point qui n'ont pas de secret pour vous j'en suis sur.
    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
     
    program Annu;
    uses crt;
    type personne = record
    		 titre: string;
    		 Nom :String;
    		 Prenom:string;
    		 NumRue: integer;
    		 nomRue: String;
    		 ville:string;
     
    var Annuaire : array[1..10] of personne;
        nbPers:integer;
        i,j : integer;
        f: file of personne;
        Unite: personne;
        Fpos,Fsize:integer;
     
    Begin
    Clrscr;
    Assign(F,FichierAnnu);
    REset(F);
    Fsize:=FileSize(f);
    write('Nbre de personne à saisir ');
    readln(nbpers);
    for i to nbPers do
    begin;
      write('Entrez le titre de la personne : ');
      readln(Annuaire[i].titre);
      write('Entrez le nom : ');
      readln(Annuaire[i].nom);
      write('Entrez le prénom : ');
      readln(Annuaire[i].prenom);
      write('Entrez le N° de rue : ');
      readln(Annuaire[i].numRue);
      write('Entrez le nom de la rue : ')
      readln(Annuaire[i].nomRue);
      write('Entrez la ville : ');
      readln(Annuaire[i].ville);
      end;
    Je voudrais ecrire sur le fichier 'fichierAnnu' les données des personnes saisis avec leur coordonneés afin de pouvoir les 'resortir' à la demande :
    De plus je voudrais pouvoir rajouter des personnes à la suite du fichier :
    Merci d'avance pour les tuyaux

  16. #16
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    De suite, les strings de l'enregistrement doivent-être délimitées! Par exemple string[32]. Et puis logiquement, on saisit les données, puis on les ecrit sur le disque! Tu ouvres le fichier sans rien écrire, ni le refermer! Tu voudrais que l'on trouve la partie manquante, le reste de la procédure que tu n'as pas mis? Je pense que l'on t'a donné suffisament d'informations comme ça afin que tu puisses te débrouiller seul à présent pour résoudre cette egnime! Sache que la programmation est une suite sans fin de problèmes à résoudre! Alors amigo, je te souhaite un bon courage, car il est temps de voler de tes propres ailes! à+

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    J'ai un peu retravailler mon Prog.
    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
     
    program Annu;
    uses crt;
    type personne = record
    		 titre: string[32];
    		 Nom :String[32];
    		 Prenom:string[32];
    		 NumRue: integer;
    		 nomRue: String[32];
    		 ville:string[32];
     
    var Annuaire : array[1..10] of personne;
        nbPers:integer;
        i,j : integer;
        f: file of personne;
        Unite: personne;
        Fpos,Fsize:integer;
     
    Begin
    Clrscr;
    Assign(F,FichierAnnu);
    REset(F);
    Fsize:=FileSize(f);
    write('Nbre de personne à saisir ');
    readln(nbpers);
    for i to nbPers do
    begin;
      write('Entrez le titre de la personne : ');
      readln(Annuaire[i].titre);
      write('Entrez le nom : ');
      readln(Annuaire[i].nom);
      write('Entrez le prénom : ');
      readln(Annuaire[i].prenom);
      write('Entrez le N° de rue : ');
      readln(Annuaire[i].numRue);
      write('Entrez le nom de la rue : ')
      readln(Annuaire[i].nomRue);
      write('Entrez la ville : ');
      readln(Annuaire[i].ville);
      write(f,Annuaire[i]);
     
    for j:=1 to nbpers do
     read(f,annuaire[j]);
     fpos:=(filePos(f));
     gotoxy(1,1)
     if({$I+}IOresult{$I-}<>o) then
      writeln('error read file !') else
      begin
        writeln('position : ',Fpos);
        writeln('titre:'annuaire[i].titre);
        end;
    close(f)
    readln;
    end.
    Voila le probleme c'est qu'il me liste les personnes d'une façon bizarre avec des caracteres spéciaux devant :
    et puis il me met 'disk read error.'

    A l'attention de Sub0: tu l'as dit toi meme c'est un sujet complexe et quand on debute on cherche un peu d'aide. Je veux comprendre.je cherche juste à apprendre et je veux pas qu'on me donne la solution mais quand j'ai pas d'idée je demande.

  18. #18
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 465
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 465
    Points : 4 312
    Points
    4 312
    Par défaut
    Mouarf, tu es dûr Sub !!
    Bon petit indice : tu y es presque, il ne reste plus qu'à écrire dans le fichier les personnes que tu viens de créer. Pour cela, il faut créer une personne Unité, puis l'écrire dans le fichier avec wr***(Uni**);

    Voilà, j'ai pas tout dis

    a+

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 34
    Points : 16
    Points
    16
    Par défaut
    il manque un end;
    rectification
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    write(f,annuaire[i]);
    end;
    ;

  20. #20
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Mouarf, tu es dûr Sub !!
    Ouais! Mais je reconnaîs quand l'aide est nécessaire ou pas! Quand on abuse du forum, ça m'agace légé... surtout que l'on apprend mieux en cherchant les choses soi-même. Yffick, j'estime t'avoir donné les informations suffisantes pour débuter. Tu trouveras aussi de nombreux topics traitant sur les fichiers typés, d'ailleurs ce forum est là en dernier recours, tenez-le vous pour dit! Sur ce, un p'tit tag résolu, et je vous souhaite une excelente soirée et un bon dev! à+
    _______________________
    -> Lire les règles du forum!
    -> Pensez au tag [résolu]!

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

Discussions similaires

  1. [langage] manipulation de fichiers
    Par perleur dans le forum Langage
    Réponses: 5
    Dernier message: 03/01/2005, 17h33
  2. Manipulation de fichier (copier, supprimer, déplacer)
    Par Guigui_ dans le forum Général Python
    Réponses: 1
    Dernier message: 21/10/2004, 11h26
  3. Manipulation des fichiers
    Par monsau dans le forum Langage
    Réponses: 7
    Dernier message: 21/09/2004, 18h45
  4. Manipulation de fichiers - gestion d'extensions
    Par ulukai dans le forum Linux
    Réponses: 13
    Dernier message: 02/07/2003, 16h28
  5. Réponses: 2
    Dernier message: 18/01/2003, 18h06

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