Probleme gestion fichier pascal
offa
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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.
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:
- Probleme gestion fichier pascal
- Fichier bin - Guide
- Turbo pascal - Télécharger - Édition & Programmation
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
8 réponses
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 ^_^'
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
- é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
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 :
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;
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)
Mais au moins ça te permettra de t'améliorer en programmation (plus qu'en attendant qu'on te donne la réponse)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai essayé de le faire mais c'est les fonctions qui me posent problemes
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...
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...
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
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
merci de ton aide et bonne nuit
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
Pour le reste, rien à dire, j'ai toutefois fais quelques améliorations dans la boucle:
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.
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
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;
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;