[C] Ajout/suppression d'un enregistrement

Fermé
fabianno - 16 avril 2003 à 17:10
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 24 juin 2014 à 18:22
Bonjour;
j'ai un fichier séquentiel avec des enregistrements( tableau de structures ) , pour écrire dans le fichier et ajouter un enregistrement pas de probleme avec fprintf mais alors pour supprimer un enregistrement ou modifier !!!!!!!!!!!!! Comment faire pour atteindre précisement un enregistrement ds le fichier , comment le lire en mémoire ?
j'ai un tableau de structure
struct collection
{
char nom[50];
char auteur[60];
}livre[100];

Voilà s'il vous plait , si vous pouviez m'aider je vous en serais extremement reconnaissant
Merci d'avance
Antoine
A voir également:

12 réponses

salut
svp , jai un prb avc c,
en fait , je trouve une déficulé pour modifier un champs dans un enregistrement ( mise à jour d'un fichier):
j'ai ce enregistrement
typedef struct
{
char nom[20];
char prenon[20];
float note;
}etudiant;
mn prob c'est que je veux modifier la note d'un etudiant , sachant que j'ai 3 étudiant qui sont stokés ds un fichier de type txt

svp aidé moi

merci d'avance
4
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
6 avril 2008 à 12:02
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
16 avril 2003 à 17:22
pour atteindre précisément l'endroit souhaité, il faut parcourir le fichier en comparant chaque ligne/mot/chaine de caracatère à l'enregistrement que tu veux supprimer... pour cela il doit y avoir une fonction read ou fread... qui fonctionne comme le fprint.. et qui te retourne la ligne courante de ton fichier... si c'est pas la bonne tu passes à la suivante, etc...

mais il faudrait que tu soit un peu plus clair sur la structure de ton fichier, parce que j'ai pas bien compris à quoi correspond tes enregistrements...
0
en fait ;
je dois faire un tableau de structure car je dois trier par nom,comparer des chaines de caractère , et par exemple pour l'ajout , je prends de livre[i].nom à livre[n].nom , je boucle et j'enregistre tout ca .
j'ai un champ : char nom pour le nom du livre
et aussi char auteur

je vais essayer avec fread je sais que ca existe , il ya aussi fgets pour lire ligne par ligne , mais bon je me prends la tete depuis 4jours et j'y arrive tjs pas .Exemple : supprimer un enregistrement complet où le nom du livre ==le chien (par exemple) avec la fonction strcmp
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
16 avril 2003 à 17:49
mais tu travaille sur un fichier ou un tableau.. c'est ça que je comprend pas...

de toute façon le pb est le même...
si c'est dans un tableau

tu fais un truc du genre :

tant que tu n'as pas trouvé ton enregistrement ou que c'est pas la fin du tableau

tu lis la ligne/enregistrement
tu compares avec strcmp
si c'est ok tu arretes (avec un booleen)
sinon tu fais rien, tu passes à la ligne suivante avec le tant que


fin tant que


par contre si tu effaces dans un tableau il faut que tu le mette à jours à la main... en gros si tu efface tab[2] il faut que tu décale tous les suivants sinon tab[2] sera toujours vide...
0
abdelmoughit
24 juin 2014 à 17:51
Bjr est comment on peux suprimer car j ai un probleme tjr sur ce code

for (p=j;p<=i;p++)
{
(A[0].id) = (A[p+1].id);
(A[p].nom)=(A[p+1].nom);
(A[p].prenom)=(A[p+1].prenom);
(A[p].profession)=(A[p+1].profession);
(A[p].num)=(A[p+1].num);
}
i--;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 24/06/2014 à 18:22
Merci d'ouvrir ton propre post pour qu'on réponde à ton sujet.
0

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

Posez votre question
Grand merci pour la rapidité des réponses , c'est très gentil!!!!

Quand je travaille en tableau , y a pas de probleme je supprime puis je décale a partir de i jusque au compteur .Mais c'est dans un fichier que j'arrive pas à travailler .En fait avec un fichier je ne dois plus travailler en tableau ? comment faire alors ? Et à chaque modif ds le fichier , je dois creer un nouveau alors? et est ce possible d'écraser l'ancien ?
En fait (en principe )je dois toujours travailler en fichier , mais n'y arrivant pas j'ai essayé en mémoire .Mon programme de repertoire de livre est terminé (en mémoire ) .Mais en fichier , c'est la galère!!!!!!!!!!!!!!!
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
16 avril 2003 à 18:12
T'inquiètes pas tu devrais pas tarder à t'en sortir...

pour lire dans ton fichier, il y a une commande qui te permet de te placer au début du fichier et une à la fin.. je ne les connais pas par coeur mais bon...exactement comme pour le tableau...
la seule chose c'est que tu ne pas aller à un endroit directement ... il faut que tu parcours à chaque fois
la fin du fichier c'est un truc du genre eof (end of file)

après essai d'utiliser la fonction qui permet de lire ligne à ligne parce que sinon tu es obligé de définir la taille de ce que tu veux lire et si t'en es pas sûr c'est galère.. quoique tu dois pouvoir avec des sizeof(chaine de caractère) bref..;
un fois que tu as récupéré ta ligne ou tu dois avoir écris un truc du genre :

titre_livre nom_auteur prenom_auteur nb_pages etc...

tout ça séparé par des espaces... ça dépend comment tu écris dans ton fichier(il faut que tu me l'expliques si tu veux plus de détail)

Donc une fois que tu as ta ligne tu la mets dans une grosse chaine de caractère dans laquelle tu cherches les espaceset tu te déplace dans la chaine pour trouver le champs avec quoi tu veux comparer (ex titre_livre = chien)

Bon si tu as des espaces dans les titres des livres il va falloir envisager autre chose...

et si tu trouves pas tu passes à la ligne suivante..
pour ça il suffit de lire à nouveau avec fgets .. parce que chaque fois que tu lis une ligne, ton curseur est ensuite positionné à la ligne suivante...
0
si tu veux le code source
http://membres.lycos.fr/examendepmp/projet.c

ca sera plus facile
mon fichier est de ce type
NOM : untel
PRENOM:dppdp
ADRESSE:huuu

Ici c'est plus des livres mais des personnes mais bon le principe est le meme
0
En plus , dois je continuer à utiliser un indice si je travaille en fichier , ? mais alors comment vais je trier mon fichier sans indice?

j'en peux plus c'est de la folie , meme avec internet et 10 bouquins sur le C devant moi , j'y arrive pas .!!!!!!!!!!!!!!
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
16 avril 2003 à 18:34
oups j'ai envoyé sans faire.. exprès..
bon il faut que j'y aille ... j'ai ton source.. je vais le regarder demaint matin... et je t'expliquerais(si j'y arrive)... t'inquiètes je vais essayer de t'aider ..
à demain...
0
t'es adorable, je t'envoi un meilleure source par mail ou sur le ftp ce soir .Un très grand merci et à demain , bonne soirée
0
voici le fichier sans erreur , compilable de mon projet .Mais avec des tableaux de structure , tout se fait en memoire et sauvegarde dans un fichier record.txt en sortie

http://membres.lycos.fr/examendepmp/agenda_memoire.c

encore un grand merci
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5 > fabio
17 avril 2003 à 09:48
Bonjour,

bon je suis en train de regarder ton code..
mais je ne peux pas le compiler parce qu'en ce moment je travail pas en C...

mais par contre j'ai trouvé un site qui explique super bien comment :
- Ajouter un enregistrement à un fichier
- Supprimer un enregistrement dans un fichier
- Modifier un enregistrement dans un fichier

et il y a même un exemple pour l'insertion d'un enregistrement à introduire au clavier dans un fichier trié selon la seule rubrique de ses enregistrements: le nom d'une personne. La comparaison lexicographique des noms des personnes se fait à l'aide de la fonction strcmp.

http://www.ltam.lu/Tutoriel_Ansi_C/prg-c148.htm

regarde et tu comprendras comment fonctionnent les fichiers séquentiel (il y a des dessins)
si jamais tu n'y arrives vraiment pas avec cet exemple, écris moi ce que tu comprends pas..
0
fabio > fabio
17 avril 2003 à 11:52
merci je vais lire ca , c'est très gentil , mon code est mis à jour sur le ftp http://membres.lycos.fr/examendepmp/agenda_memoire.c

encore merci si tu veux une analyse du code je l'ai aussi , ds le meme repertoire c'est prog.doc
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
17 avril 2003 à 13:46
je t'ai dis une grosse bêtise tu n'as pas besoin de mettre de séparateur :

si tu écris dans ton fichier avec une commande de ce style

fprintf(OUTFILE, "%s %s %s %d %s\n", nom,prenom,adresse,date,telephone );

tu peux faire directement quand tu lis dans le fichier une commande qui te mets directement les valeurs dont tu as besoin dans des variables...

fscanf (INFILE, "%s %s %s %d %s\n", nom,prenom,adresse,date,telephone );


enfin c'est à tester... mais ça devrait être possible..

voilà, je pense que tu devrais t'en sortir maintenant..

Letissya
0
merci avec ca je vais bien m'en sortir , tu ne pourras pas mieux m'aider!!!!!!!!!c'est très gentil.
J'aimerais encore t'ennuyer une dernière fois , donc mon source il ya une fonction de tri (trialpha()) , j'utilise deux fois le meme code de permutation c'est inutile , pourrais m'indiquer le moyen de creer une fonction permute void permute(arguments) , je ne sais pas quels arguments je dois lui passer.
Encore un grand merci de consacrer autant de tps pour moi !!!!!!!!!!!
0
letissya Messages postés 89 Date d'inscription mercredi 16 avril 2003 Statut Membre Dernière intervention 8 novembre 2005 5
17 avril 2003 à 17:28
Bon je vais te faire un algo approximati


void permut( type_char ancien_nom,
type_char nouv_nom,
type_char ancien_prénom,
type_char nouv_prénom,
type_char ancien_adr,
type_char nouv_adr,
type_date ancien_date,
type_date nouv_date
type_char ancien_tél,
type_char nouv_tél)

{
char temp; // exactement comme dans ton code
int tmp;

// et après tu fais pareil sauf que tu changes les noms avec tes params
strcpy(temp,ancien_nom);
strcpy(ancien_nom,nouv_nom);
strcpy(nouv_nom,temp);
fflush(stdin);
strcpy(temp,ancien_prénom);
strcpy(ancien_prénom,nouv_prénom);
strcpy(nouv_prenom,temp);
fflush(stdin);
strcpy(temp,ancien_adr);
strcpy(ancien_adr,nouv_adr);
strcpy(nouv_adr,temp);
fflush(stdin);
tmp=ancien_date;
ancien_date=nouv_date;
nouv_date=tmp;
fflush(stdin);
strcpy(temp,ancien_tel);
strcpy(ancien_tel,nouv_tel);
strcpy(nouv_tel,temp);
fflush(stdin);

}


et pour appeler la ta procédure tu fais :


permut( personne[i].nom,
personne[j].nom,
personne[i].prenom,
personne[j].prenom,
personne[i].adresse,
personne[j].adresse,
personne[i].date,
personne[j].date,
personne[i].telephone,
personne[j].telephone);



voilà ça doit être à peu près ça...

par contre il est possible qu'il faille que tu passes tes paramètres par adresse et non par valeur comme c'est le cas ici sinon ça va pas marcher...

bon pour t'éclairer tu as une explication là :
http://www.ltam.lu/Tutoriel_Ansi_C/prg-c121.htm

il faut juste que tu rajoutes des * et des & dans ton code rien de méchant tu vas vite comprendre ( si tu ne le sais pas déjà!!)

ben bon courage

a+


Letissya
0
voilà je m'en suis finalement sorti et grace à toi, je ne sais comment te remercier .Si tu as encore des problemes SQL je peux t'aider , ca sera avec plaisir.A très bientot et encore merci
0