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]Lecture-ecriture fichier


Sujet :

Langage Pascal

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut [LG]Lecture-ecriture fichier
    bonjour, apres avoir lu le tutoriel sur les manipulations de fichiers j'ai essayer de mettre en application et j'obtiens beaucoup d'erreur (en bref ca marche pas..)
    voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var f : ^file of cuisine;
    var t:cuisine;
    begin
       assign(t,f^);
       new(f^);
       rewrite(t);
       saisir_tab(t);
       rewrite(t);
    end.
    en fait je veux sauvegarder le tableau t apres qu'il est été enregistrer par l'utilisateur, mais j'ai l'impression que je n'est pas saisi le fonctionnement de la manipulation de fichiers
    si vous pouviez me dire pourquoi est ce que cela ne marche pas et me proposez une solution je vous en serait tres reconnaissant
    merci d'avance

  2. #2
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Déjà, je ne comprends pas pourquoi tu passes par un pointeur pour un fichier (en général c'est plutôt pour des objets qui prennent de la place en mémoire comme des tableaux) mais si tu tiens à le faire, vaudrais mieux mettre la directive new(f^) avant d'appeler f^, donc avant la directive assign(t,f^).

    Une autre petite chose, la procédure assign met en rapport un type de fichier (text, file, file of ...) avec un nom de fichier (C:\test.txt). Là, tu mets une varible "cuisine" qui apparement n'est pas un fichier d'un côté et "file of ..." d'un autre.

    De plus, tu utilises 2 fois de suite la directive "rewrite" (avec une variable qui n'est pas un fichier mais bon...). "Rewrite" a pour but de créer un fichier et de l'ouvrir, même si celui ci existe déjà. Tu perds donc toute information contenue dans un fichier déjà existant di tu l'appelles avec "rewrite" or là, apparement, tu voulais l'ouvrir, écrire dedans et le ré-ouvrir...

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    apparemment j'ai vraiment rien compris au fonctionnement... pour ce qui est des pointeurs j'avai de toutes facons prévu de les enlever, mais pour le fichier....
    en fait si je comprend bien je doi avoir un fichier qui contiendra mon tableau , je doi le déclarer, par exemple comme file of c:/.. ?? ou pas parce que je vois pas comment le declarer, ensuite je dois lui assigner une variable ?? ou est ce que en fait je déclare et j'assigne une variable au fichier par l'intermédiaire de Assign ???
    une foi que jaurai compris ca, ca sera déja pas mal...
    Mais ensuite si je ve lire le fichier, enfin pas vraiment le lire mais utiliser les données qu'ils contient est ce que je doi utiliser une fonction spécial ??? et pour écrire sur mon fichier une foi qu'ils a été modifier quel fonction dois-je utiliser ??

    pfff encore beaucoup de boulot, mais j'y arriverai ...lol merci pour votre aide

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Ouhla

    Sous Turbo Pascal, un fichier peut être de trois types différents : text (contient des données texte), file (contient des données binaires), file of autre_type (contient des données binaire du type autre_type). Pour que TP puisse utiliser un fichier, il faut lui spécifier le nom du fichier à manipuler : ceci est fait avec assign. Une fois que tu as déclaré ta variable fichier, tu lui assignes un nom avec assign :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var f: text;
    ...
    assign(f, 'c:\test.txt');
    Il te faut ensuite ouvrir le fichier. Ceci peut être fait avec rewrite (crée et ouvre un fichier), ou avec un reset (ouvre un fichier) ou append (ouvre un fichier et se place à la fin). Les opérations de lecture et d'écriture dans un fichier se font avec read(ln) et write(ln), comme pour la sortie standard. Une fois ces opérations terminées, il faut fermer le fichier, avec close...

    Regarde l'aide de ton compilateur pour ces fonctions et leur syntaxe.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    Ok j'ai réussi à comprendre la partie declaration, et a faire tourner le programme, je l'ai ensuite modifier parce que je veut ne veut écrire sur le fichier que ssi celui ci est vide, j'ai donc utilisé et ensuite si le fichier n'est pas vide je veut le lire et quand j'essaye de le lire j'obtiens toujours un message d'erreur soit afficher par le compilateur du style "can't use readln....on file of this type"ou sinon pendant l'execution du programme "read invalide sur fichiers typés" j'ai essayer les 3 fonctions, c'est a dire read, readln, et blockwrite...
    pfff....c compliqué ...lol moi tout ce que je veut en fait c'est que ma la variable T prenne la "valeur" du fichier f, et ainsi mon programme fonctionne comme si la variable t avait été affecter par l'utilisateur au début du programme...
    voici 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
    var f: file of cuisine;
    var t:cuisine;
    var s:char;
    begin
         assign(f, 'c:/emp');
         reset(f);
         blockread(f,t,10);
         if filesize(f) <> 0 then begin
            saisir_tab(t);
            blockwrite(f,t,10);
            close(f);
         end
         else begin
              writeln('afficher le pré-tableau pour la cuisine ou pour la salle , (C/S)');readln(s);
              trace_tablo(t,s);
              writeln('appuyer sur entrer pour afficher le pré-tableau suivant vous pourrez');
              writeln('ensuite les modifier');
              readln;
              if (s='c') or (s='C') then s:='s'
              else s:='c';
              trace_tablo(t,s)
         end;
         close(f);
    end.
    voila comme ca vous pourrez me dire où est l'erreur.... parce que je commence a me décourager ...lol

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Pour connaitre la taille d'un fichier, on utilise filesize oui, mais dans le cas des fichiers file of, filesize renvoie le nombre de bloc. Pour connaitre la taille du fichier en octets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FileSize(f) * SizeOf(cuisine)
    Ensuite pour lire, c'est read, et non pas blockread, qui sert à lire dans un buffer (et pas forcément des blocs complets... une série d'octets en tout cas)

    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
     
    var f: file of cuisine;
    var t:cuisine;
    var s:char;
    begin
         assign(f, 'c:/emp');
         reset(f, SizeOf(cuisine));
         if filesize(f) <> 0 then begin
            read(f,t);
            saisir_tab(t);
         end
         else begin
              writeln('afficher le pré-tableau pour la cuisine ou pour la salle , (C/S)');readln(s);
              trace_tablo(t,s);
              writeln('appuyer sur entrer pour afficher le pré-tableau suivant vous pourrez');
              writeln('ensuite les modifier');
              readln;
              if (s='c') or (s='C') then s:='s'
              else s:='c';
              trace_tablo(t,s)
         end;
         close(f);
    end.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut

    Bon, ben c'est pas encore ça, mais faut pas se décourager comme ça
    Un p'tit topo vite fait s'impose semble-t-il.

    On distingue trois "types" de fichiers, même si sur le disque, les fichiers sont unis dans l'adversité
    • 1. Les fichiers texte
      Les fichiers texte sont uniquement composés (interprétés) de lignes de caractères, terminée par des retours à la ligne.
      Ils sont déclarés par le type Text (TextFile sous Delphi).

      Les seules fonctions d'E/S utilisables avec ce type sont :

      [list:851e6758f1]
    • Write
    • WriteLn
    • Read
    • ReadLn
    • Eof


    Exemple :[/list:u:851e6758f1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      f: Text;
      S: string;
    begin
      Assign(f, 'FILE.DAT');
      Reset(f);
      while not Eof(f) do
      begin
        ReadLn(f, S);
        WriteLn(S);
      end;
      Close(f);
    end.
    • 2. Les fichiers binaires simples
      Les fichiers binaires se déclarent au moyen du type file. Leur caractéristique est qu'ils peuvent contenir n'importe quel type de données, dans un ordre quelconque.

      Les fonctions d'E/S utilisables avec ce type sont :
      [list:851e6758f1]
    • BlockWrite
    • BlockRead
    • FileSize


    Exemple :[/list:u:851e6758f1]
    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
      f, g: file;
      NumLus, NumEcrits: Word;
      Buffer: array[0..2047] of Byte;
    begin
      Assign(f, 'SOURCE.DAT');
      Reset(f, 1);
      Assign(g, 'DEST.DAT');
      Rewrite(g, 1);
     
      repeat
        BlockRead(f, Buffer, SizeOf(Buffer), NumLus);
        BlockWrite(g, Buffer, NumLus, NumEcrits);
      until (NumLus <> NumEcrits) or (NumLus < SizeOf(Buffer));
     
      Close(f);
      Close(g);
    end.
    • 3. Les fichiers binaires typés
      Ce type de fichier est déclaré au moyen d'un type, d'une structure de données, qui sont stockées les unes à la suite des autres dans le fichier. Le fichier ne peut contenir qu'un seul type de données.
      On les déclare avec le type file of record.

      On utilise les fonctions d'E/S suivantes :
      [list:851e6758f1]
    • Read
    • Write
    • Eof


    Exemple :[/list:u:851e6758f1]
    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
    type
      TData = record
        Nom: string[20];
        Prenom: string[20];
      end;
     
    var
      f: file of TData;
      Item: TData;
    begin
      Assign(f, 'FILE.DAT');
      Reset(f);
      while not Eof(f) do
      begin
        Read(f, Item);
        WriteLn(Item.Nom, ' ', Item.Nom);
      end;
      Close(f);
    end;
    A ces fonctions s'ajoutent les fonctions standard de gestion des fichiers :
    • Assign (AssignFile sous Delphi)
    • Reset
    • Append
    • Rewrite
    • Close (CloseFile sous Delphi)



    Je pense que les questions seront nombreuses, alors n'hésite pas, pose !

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  8. #8
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    Tout d'abord merci pour votre aide, mais comme tout bon débutant...j'ai encore un probleme, en fait j'arrive a ouvrir le fichier, ensuite l'utilisateur modifie la variable t qui était nul au début pui apres j'ai utiliserpour écrirela variable t dans le fichier f, mais seulement voila quand j'essaye de lire la variable t par l'intermediaire d'une fonction qui doit tracer un tableau j'obtiens une erreur 216, pourtant la fonction commence a s'éxécuter, elle affiche le titre et paf des qu'elle arrive au tableau qui utlise les données contenues dans t, c l'erreur...
    je vai essayer de vous mettre un lien avec le programme et l'uniter comme ca vous pourrez regarder...
    encore merci!!!

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    L'erreur 216 (General Protection Fault) se produit généralement quand on essaye de déréférencer un pointer qui est nil... Essaye de voir si tu as bien alloué l'espace mémoire pour ton objet t...

    Tu peux également regarder l'aide de ton compilateur pour connaître les sources de tes erreurs...
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    j'ai mis mon programme et mon uniter sur le net vous pourrez la trouver a l'adresse suivante :
    http://lefebfamily.free.fr/prog+sourc.zip
    il y a l'uniter , un programme qui devrait permettre lecture et écriture , un pour ecrire sur le fichier , et un pour le lire, voila essayer et comme ca vous pourrrez peut etre me dire d'ou viens cette fameuse erreur 216.......

    Pour ce qui est des pointeur comme vous me l'avez suggerrer je n'en ai pas utiliser... donc... enfin voyez par vous meme
    8)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut


    Quel compilateur utilises-tu ? Quelle plateforme ?

    Quel est le programme qui ne fonctionne pas ? A quelle ligne ?...........
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    j'utilise dev pascal, avec freepascal...sous windows XP (mais je croi pas que cette information soit utile).
    en fait ya auncune erreur lors de la compilation, mais juste lors de l'execution, j'ai mis plusieurs programme parce que j'avai fait des test pour voir si je pouvai seulement lire ou écrire ou si je pouvai faire lé 2...
    mais le programme le plus important est lecture_ecriture, c'est celui la que j'utiliserai au final.

    Merci

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Désolé mais je vois pas d'erreur dans ton code, mis à part le reset(f,sizeof(cuisine)), que tu peux enlver, car c'est inutile ici... Et aussi la façon dont tu teste la taille, qui n'est pas correcte : utilise filesize plutôt que sizeof.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    1) Déjà une petite question : pourqoi avoir fait 3 programmes au lieu d'un seul avec un menu pour orienter le traitement, ce qui t'amène à dupliquer du code, ce qui n'est jamais bon.

    2) J'ai jeté un oeil sur tes programmes, mais pas sur planing_resto, car tant que le reste ne sera pas réglé, pas la peine de se pencher là dessus

    (J'ai mis mes commentaires avec ---- gnagnagna)

    Commençons par ecriture.pas

    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
    program SansNom; uses planning_resto; {$R+}
     
    var f: file of cuisine; 
    var t:cuisine; 
    begin 
         assign(f, 'c:/emp');
    ---- sécuriser : si f n'existe pas, plantage. 
         reset(f, SizeOf(cuisine)); 
         read(f,t);
         saisir_tab(t);
    ---- ici, read a déplacé le compteur du fichier, on écrit à la suite,
    ---- donc un 2ème enregistrement
         write(f,t);
         close(f);
    end.
    Continuons avec lecture.pas

    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
    program Untitled; uses planning_resto,crt;
     
    var f: file of cuisine; 
    var t:cuisine; 
    var s:char; 
    begin 
         assign(f, 'c:/emp'); 
    ---- sécuriser : si f n'existe pas, plantage. 
         reset(f, SizeOf(cuisine));
         read(f,t);
         writeln('afficher le pré-tableau pour la cuisine ou pour la salle , (C/S)');readln(s);
    ---- ici, trace_tablo, qu'on retrouve plus loin après mise en forme de s,
         trace_tablo(t,s); ---- il faut effacer cette ligne 
         writeln('appuyer sur entrer pour afficher le pré-tableau suivant vous pourrez');
         writeln('ensuite les modifier');
         readln;
    ---- là, je ne comprends pas
    ---- j'aurais plutôt écrit, pour rester cohérent, sinon tu inverses l'entrée
    ---- if (s='c') or (s='C') then s:='c'
    ----  else s:='s';
         if (s='c') or (s='C') then s:='s'
         else s:='c';
         trace_tablo(t,s);
         close(f);
    end.
    et enfin avec lecture_ecriture.pas

    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
    program Untitled; uses planning_resto,crt;
     
    var f: file of cuisine; 
    var t:cuisine; 
    var s:char; 
    begin 
         assign(f, 'c:/emp'); 
    ---- sécuriser : si f n'existe pas, plantage. 
         reset(f, SizeOf(cuisine)); 
    ---- si cuisine est un record NON VIDE, donc avec au moins un élément,
    ---- quel que soit le type de cet élément,
    ---- alors sizeOf(cuisine)est forcément <> 0
    ---- de plus, lire un élément de taille 0 ne signifie rien
         if sizeOf(cuisine)= 0 then begin
            read(f,t); 
            saisir_tab(t);
    ---- idem dans ecriture.pas
            write(f,t);
         end
         else begin
              read(f,t);
              writeln('afficher le pré-tableau pour la cuisine ou pour la salle , (C/S)');readln(s);
    ---- ici, trace_tablo, qu'on retrouve plus loin après mise en forme de s,
              trace_tablo(t,s); ---- il faut effacer cette ligne 
              writeln('appuyer sur entrer pour afficher le pré-tableau suivant vous pourrez'); 
              writeln('ensuite les modifier'); 
              readln; 
    ---- idem dans Lecture.Pas
              if (s='c') or (s='C') then s:='s' 
              else s:='c'; 
              trace_tablo(t,s);
         end; 
         close(f); 
    end.
    Voilà, il faut corriger tout ça, et, comme dit au début, il vaut mieux faire un seul programme, ne serait-ce que pour éviter aux utilisateurs de fermer un programme, puis en réouvrir un autre...
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  15. #15
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    Ok merci je vai essayer de modifier tout ce que tu m'as suggerer.
    je vous tiens au courant

  16. #16
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    j'ai modifier la plupart des choses qui m'avait été conseiller de faire , voivi le nouveau lien vers le prog(1seul cette fois ci à) et la source:
    http://lefebfamily.free.fr/prog2.zip

    il y a 2 choses que je n'ai pas modifier, tout d'abord je n'ai pas sécuriser.... tout simplement parce que je ne sais pas réellement comment faire pour vérifier si un fichier existe ou pas.
    la deuxieme chose c'est enlever la premiere apparition de la procedure trace_tablo, parce que , je vous explique, disons que la variable t est un tableau avec seulement 2 entrée, la premiere "cusine" et la deuxieme "salle". au début je demande a l'utilisateur si'il veut commencer par tracer le tableau de la cuisine ou de la salle.
    l'utilisateur entre donc soit 'c' soit 'C' soit 's' et soit 'S'
    la procedure se sert de se caractere pour determiner quelle tableau elle doit tracer, donc la premiere foi elle va tracer soit le tableau de cuisine soit le tableau de salle.
    ensuite si il y a ce morceau de code que tu n'avais pas compris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              if (s='c') or (s='C') then s:='s' 
              else s:='c'; 
              trace_tablo(t,s);
    en fait si la premiere foi c'est le tableau de cuisine qui a été tracer alors la variable s qui était soit 'c' soit 'C' devient 's' et ainsi je suis sur qu'elle trace le tableau pour la salle lors de la deuxieme apparition de la procedure.

    Enfin tout ceci n'est pas le plus important... le plus important c'est que malgré les changements que j'ai effectuer ca ne marche toujours pas. voici le 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
    var f: file of cuisine; 
    var t:cuisine; 
    var s:char; 
    begin 
         assign(f, 'c:/tab');
         if sizeOf(f)= 0 then begin
            saisir_tab(t);
            write(f,t);
         end
         else begin
              read(f,t);
              writeln('afficher le pré-tableau pour la cuisine ou pour la salle , (C/S)');readln(s);
              trace_tablo(t,s);
              writeln('appuyer sur entrer pour afficher le pré-tableau suivant vous pourrez'); 
              writeln('ensuite les modifier'); 
              readln; 
              if (s='c') or (s='C') then s:='s' 
              else s:='c'; 
              trace_tablo(t,s);
         end; 
         close(f); 
    end.
    cette fois ci le programme se lance et la fenetre se referme tout de suite apres.
    Il me faudrait une précision dites moi si j'ai bien compris, la focntion read(f,t) va parcourir le fichier f du début jusqu'a la fin donnant a t toutes les valeurs qui était stocké dans f ?? si c'est le cas je vois vraiment pas ce qui ne marche pas.

    le fait que le programme se referme vient peut etre du premier saut conditionnelle, je suis paumé ....
    un jour viendra ou je réussirai a faire marcher ce ?%/* de programme...lol

    merci d'avance pour vos réponses....

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Lis-tu ce qu'il y a marqué plus haut ? Pour tester la taille d'un fichier on utilise FileSize, et pas SizeOf...

    Citation Envoyé par arno15
    il y a 2 choses que je n'ai pas modifier, tout d'abord je n'ai pas sécuriser.... tout simplement parce que je ne sais pas réellement comment faire pour vérifier si un fichier existe ou pas.
    réponse dans la faq : http://pascal.developpez.com/faq (merci de la lire au passage, et de lire également les règles du forum

    Citation Envoyé par arno15
    Il me faudrait une précision dites moi si j'ai bien compris, la focntion read(f,t) va parcourir le fichier f du début jusqu'a la fin donnant a t toutes les valeurs qui était stocké dans f ?? si c'est le cas je vois vraiment pas ce qui ne marche pas.
    Ben non justement, read ne renvoie qu'un seul élément, celui qui est à la position courante dans le fichier (position courante qui est augmentée par la suite). Si tu fais fais un read(f, t) juste après ouvert le fichier, tu obtiendras le premier élément du fichier, pas plus... Pour faire un parcours total du fichier, il te faut utiliser une boucle avec un eof() pour tester si tu es arrivé au bout de ton fichier.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Euh, il faudrait penser à ouvrir ton fichier à l'occasion
    On t'as dit de sécuriser le Reset, pas de le supprimer

    Pour info, tu nous as dit coder sous Windows, donc les chemins d'accès s'effectuent avec des \ et non des / . Tu n'es pas sous Unix...
    Ton chemin devient donc, si on suit strictement ce que tu as écrit, ceci : 'C:\tab'

    Pour Reset, il faut se conformer à l'aide :
    Citation Envoyé par L'aide
    procedure Reset(var F [: File; Recsize: Word ] );
    ...
    RecSize is an optional expression of type Word, which can be
    specified only if F is an untyped file.
    Ton fichier est typé, donc on ne spécifie pas la taille des enregistrements. Comme dans l'exemple que j'avais donné... Reçu ?

    Bon, voilà le schéma général pour la lecture/écriture de ton fichier :
    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
     
    type
      Cuisine = record
        ...;
      end;
     
    var
      f: file of Cuisine;
      t: Cuisine;
      s: Char;
    begin
      (* Désactivation des erreurs d'E/S pour les capturer silencieusement *)
      {$I-}
      Assign(f, 'C:\tab');
      (* Il ne faut pas spécifier la taille de l'enregistrement, le compilateur le calcule seul *)
      Reset(f);
      (* On vérifie qu'aucune erreur n'a eu lieu... *)
      if IOResult = 0 then
      begin
        (* Tant que la fin du fichier n'est pas atteinte... *)
        while not Eof(f) do
        begin
          (* On lit un enregistrement *)
          Read(f, t);
          (* Si pas d'erreur, on l'utilise *)
          if IOResult = 0 then
            WriteLn(t.tab[1].lieu)
          else
          (* Sinon, erreur et sortie de la boucle While *)
          begin
            WriteLn('Erreur lors de la lecture');
            Break;
          end;
        end;
     
        (* Fermeture du fichier *)
        Close(f);
      end
      else
        WriteLn('Fichier inaccessible');
     
      (* Réactivation des erreurs E/S *)
      {$I+}
    end.
    Attention !
    Tu utilises des "string" dans ton type Cuisine avec FreePascal. Il est possible (à vérifier) que les chaînes utilisées par FreePascal soient des chaînes dites "longues", donc à longueur indéterminée. Il est préférable de spécifier une longueur max pour ta chaîne, par exemple, pour une taille de 30 caractères :

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  19. #19
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 417
    Points
    59 417
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Dans l'aide en ligne de FP, il y
    Short strings

    A string declaration declares a short string in the following cases:
    > If the switch is off: { $H- }, the string declaration will always be a
    short string declaration.
    > If the switch is on { $H+ }, and there is a length specifier, the
    declaration is a short string declaration.
    The predefined type ShortString is defined as a string of length 255:

    ShortString = String[255];

    If the size of the string is not specified, 255 is taken as a default. The length of the string can be obtained with the Length standard runtime routine. For example in

    {$H-}

    Type
    NameString = String[10];
    StreetString = String;

    NameString can contain a maximum of 10 characters. While StreetString can contain up to 255 characters.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  20. #20
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2005
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2005
    Messages : 78
    Points : 70
    Points
    70
    Par défaut
    Ok j'ai bien compris, merci encore beaucoup pour tout votre aide ca m'aura été tres utile.
    mais finalement je croi que j'ai trouver plus facil a réaliser...
    En fait je vai passer toutes les variables que peut contenir mon type 'cuisine' en chaines de caracteres, et ainsi j'enregistrerait sur un fichiers texts, je n'aurai plus de probleme ( enfin j'espere),
    Pour information , j'avai réussi a tirer quelque chose de mon fichiers typés, sauf que lorsque que je lancai ma procedure pour dessiner mon tableau j'obtenais des chaines de caracteres incompréhensibles, (peut etre un code extra-terrestre ??!!lol), et je pense que c'était parce que je n'extrayait pas les données dans l'ordre qu'il fallait ou quelque chose du genre.
    Donc c'est pour ca que j'ai penser que ca serai plus facil de passer par un fichier text ne serait ce que pour l'organisation des données de l'enregistrements.

    Voila en tout cas j'espere que je vais y arriver, mais de toutes facons comme on dit c'est en faisant des erreurs qu'on apprend ( et je peut vous dire que des erreurs je vais encore en faire beaucoup, vu tout ce qu'il me reste a apprendre...).
    MERCI BEAUCOUP D'AVOIR éTé ATTENTIF A MON PROBLEME !!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/11/2006, 20h57
  2. PL/SQL lecture/ecriture fichier txt
    Par stos dans le forum PL/SQL
    Réponses: 2
    Dernier message: 19/05/2006, 12h19
  3. [lecture/ecriture] fichier excel
    Par ethno dans le forum C
    Réponses: 4
    Dernier message: 14/04/2006, 19h47
  4. php: lecture ecriture fichier
    Par kda007 dans le forum Langage
    Réponses: 2
    Dernier message: 07/02/2006, 18h49
  5. [AS2] Lecture Ecriture Fichier Texte
    Par cpr0 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 13/09/2005, 11h22

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