Probleme gestion fichier pascal

Bonjour,
j'ai besoin de votre aide j'ai un programme pascal qui permet de remplir un fichier ancien avec des enregistrements par la suite copier le contenu de se fichier dans un autre fichier appelé nouveau les problemes
*c'est que dans l'ancien fichier l'enregistrement se fait seulement du premier et dernier nom
* le nouveau fichier est toujour vide
help merci

uses wincrt;
const emplacement='c:\tp\ancien.txt';
type
information = record
nom : string;
prenom : string;
moyenne : integer;
end;
tab2 = array[1..12] of information;
var
i:integer;
nouveau:file of information;
ancien: file of information;
eleve:information;
elle:information;
begin
assign (ancien,emplacement);
reset(ancien) ;
for i:=1 to 3 do
begin
with elle do
begin
write('nom=');
readln(nom);
write('prenom=');
readln(prenom);
write('moyenne=');
readln(moyenne);
end;
write(ancien,elle);
end;
assign(nouveau,'c:\tp\nouveau.txt');
rewrite(nouveau);
while not eof(ancien)do
begin
read(ancien,eleve);
write(nouveau,eleve);
end;
close(ancien);
close(nouveau);
end.
Configuration: Windows XP
Firefox 2.0.0.7

8 réponses

  1. slt, j'ai tester la procedure saisie ça marche mais le probleme est que on ne peut pas revenir au programme source meme si on saisie la valeur 0 c puor koi j'ai voulu utiliser la boucle repeat. Merci
    1. Modérateur
      De la façon dont tu avais écrit cette boucle, la condition était length(nom)=0 ce qui est différent de nom=0.
      En fait pour revenir au programme (tel que je l'ai écrit avant) il faut taper un nom de taille 0, c'est à dire ne rien écrire, mais appuyer sur entrée quand même.
      Si tu veux sortir de la boucle en tapant un nom=0, il faudra tout simplement écrire if p.nom='0' then break;
  2. merci de ton aide et bonne nuit
    1. Modérateur
      Tu écris f:file of produit, f a donc un type bien défini, tu ne peux donc pas dire par la suite var f:produit (d'autant qu'il ne s'agit pas vraiment d'un paramètre) déclarons plutôt var p:produit; f:file of produit;
      Remarque, ta fonction ne renvoie aucun résultat, il s'agit donc d'une procédure
      procedure saisie;
      var p:produit; f:file of produit;
      begin
      end;
      Ensuite, p étant une variable de type produit, on ne peut accéder à son code, nom, prix unitaire, et quantité, qu'en utilisant p.code, p.nom, p.pu et p.qte
            write('CODE : ');
            readln(p.code);
            write('NOM : ');
            readln(p.nom);
            write('PRIX UNITAIRE : ');
            readln(p.pu);
            write('QUANTITE : ');
            readln(p.qte);
      En ce qui concerne ta boucle, j'avoue ne pas connaître l' instruction with f repeat until c'est pourquoi je ne l'utiliserai pas, je vais dire qu'au départ p.nom n'est pas vide, et faire une boucle while length(p.nom)>0 do
      p.nom:='*';
      while length(p.nom)>0 do
            begin
            //...
            if length(p.nom)>0 then write(f,p);
            end;
      Etant donné que f n'est plus une variable globale mais locale à la procédure, qu'elle est assigné et ouverte dans la procédure, il vaut mieux la fermer aussi dans cette procédure plutôt que dans ton programme de test.

      Pour le reste, rien à dire, j'ai toutefois fais quelques améliorations dans la boucle:
      uses crt;
      
      type produit=record
           code:integer;
           nom:string;
           pu:real;
           qte:integer;
           end;
      
      procedure saisie;
      var p:produit; f:file of produit;
      begin
      assign(f,'D:\test_g\repert.dat');
      rewrite(f);
      while true do
            begin
            write('NOM : '); // mettre le nom en premier est plus logique
            readln(p.nom);
            if p.nom='' then break; // sort de la boucle si pas de nom
            write('CODE : ');
            readln(p.code);
            write('PRIX UNITAIRE : ');
            readln(p.pu);
            write('QUANTITE : ');
            readln(p.qte);
            writeln;
            write(f,p); // si on arrive là c'est qu'on peut écrire
            end;
      close(f);
      end;
      
      begin
      clrscr;
      saisie;
      writeln('Fin de la saisie');
      readln;
      end.
  3. program gestion_produit;
    uses crt;
    type produit=record
    code:integer;
    nom:string;
    pu:real;
    qte:integer;
    end;
    f:file of produit;
    function saisie(var f:produit);
    begin
    assign(f,'c:\repert.dat');
    rewrite(f);
    with f do begin
    repeat
    write('CODE:');
    readln(code);
    write('NOM:');
    readln(nom);
    write('PRIX UNITAIRE:');
    readln(pu);
    write('QUANTITE:');
    readln(qte):
    if (length(nom) dif 0)then write(f,produit);
    until (length(nom)=0);
    end;
    end;
    Begin
    clrscr;
    saisie(f);
    close(f);
    readln
    end.
    j'ai fait ça pour la fonction saisie mais y a une erreur.Merci
    1. j'ai essayé de le faire mais c'est les fonctions qui me posent problemes
      1. Modérateur
        Perso je préfère aider les gens qui font :
        function Divise(a,b:integer);
        begin
        a/b
        end;
        pourquoi ça marche pas ?

        C'est faux mais ça ressemble à quelquechose qui est facile à débuger

        Plutôt qu'aider ceux (comme toi) qui arrivent et qui disent "alors voilà il me faut ça, ça et ça" !

        Ici on est sur un forum d'entraide et pas dans une classe ! alors je veux bien t'aider mais mets-y un peu du tien
        Donne nous ce que tu as fait (même si ça marche pas, ou si c'est incomplet) on va pas te dire que t'es nul, mais on t'expliquera où et pourquoi c'est faux...
    2. Modérateur
      Alors vas-voir des discussions ayant déjà traitées ce genre de problèmes (comme ici) tu auras juste à adapter ton exercice sur le code...
      Mais au moins ça te permettra de t'améliorer en programmation (plus qu'en attendant qu'on te donne la réponse)
      1. merci pour ton aide mais mon probleme est que je ne suis pas bien en programmation
        1. salut j'ai un projet en programmation pascal sur les fichiers que je doit rendre le plus vite possible et j'ai besoin de votre aide: GESTIONS DES PRODUITS
          - écrire une fonction qui permet de saisir un fichier de produit(code,nom,prix unitaire,quantité)
          - écrire une fonction qui permet d'afficher le contenu du fichier
          - écrire une fonction qui renvoie le nombre de produit dont la quantité est inférieure à 10
          - écrire une fonction qui permet de trier les produits par leur nom(par ordre alphabétique)
          - écrire une fonction qui permet d'éclater le fichier en deux.Le premier fichier contient les produits dont le prix unitaire est supérieur à 50 et le deuxième inférieur à 50
          - écrire un programme qui permet de tester

          Votre aide est vivement souhaité . Merci d'avance

          Mon mail est rakhoutall@hotmail.fr
          1. Modérateur
            Commence à faire quelque chose, il y a certains points qui ne devraient pas poser de trop gros problèmes.
            Pour le reste on t'aidera à débuger ta version beta...

            Allez juste pour s'assurer que tu commences bien :
            type produit=record
                 code,nom:string;
                 prix:real;
                 nbre:integer;
                 end;
            
                 fichier=file of produit;
        2. salut 
          j'en suis pas si sur mé essaie qd m^ :
          
          
          begin 
          assign (ancien,emplacement); 
          reset(ancien) ; 
          
          for i:=1 to 3 do 
              begin 
                    with elle do 
                        begin 
                               write('nom='); 
                               readln(nom); 
                               write('prenom='); 
                               readln(prenom); 
                               write('moyenne='); 
                               readln(moyenne); 
                       end; 
                      seek(ancien,(filesize(ancien));
                      write(ancien,elle); 
               end;
           
          assign(nouveau,'c:\tp\nouveau.txt'); 
          rewrite(nouveau); 
          while not eof(ancien)do 
                  begin 
                         read(ancien,eleve); 
                         seek(nouveau,(filesize(nouveau));
                         write(nouveau,eleve); 
          end; 
          close(ancien); 
          close(nouveau); 
          end.
          
          
          je crois avec seek qui pointe a chaque fois l'enregistrement suivant; les nouvelles valeurs n'écrasent pas leurs precedentes 
          
          BONNE CHANCE ^_^'