Probleme gestion fichier pascal

Fermé
offa - 17 oct. 2007 à 11:05
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 6 juil. 2008 à 12:46
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.
A voir également:

8 réponses

RenChu Messages postés 1 Date d'inscription samedi 24 mai 2008 Statut Membre Dernière intervention 24 mai 2008
24 mai 2008 à 18:54
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 ^_^'
0
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
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 juil. 2008 à 00:29
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;
0
rakhou10 Messages postés 4 Date d'inscription vendredi 4 juillet 2008 Statut Membre Dernière intervention 5 juillet 2008
5 juil. 2008 à 00:36
merci pour ton aide mais mon probleme est que je ne suis pas bien en programmation
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 juil. 2008 à 00:51
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)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rakhou10 Messages postés 4 Date d'inscription vendredi 4 juillet 2008 Statut Membre Dernière intervention 5 juillet 2008
5 juil. 2008 à 00:57
j'ai essayé de le faire mais c'est les fonctions qui me posent problemes
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 juil. 2008 à 01:06
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...
0
rakhou10 Messages postés 4 Date d'inscription vendredi 4 juillet 2008 Statut Membre Dernière intervention 5 juillet 2008
5 juil. 2008 à 01:36
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
0
rakhou10 Messages postés 4 Date d'inscription vendredi 4 juillet 2008 Statut Membre Dernière intervention 5 juillet 2008
5 juil. 2008 à 01:52
merci de ton aide et bonne nuit
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 juil. 2008 à 12:48
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.
0
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
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
6 juil. 2008 à 12:46
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;
0