Enregistrer dans un fichier (programmae en c)

Fermé
Utilisateur anonyme - 11 janv. 2008 à 13:18
 Utilisateur anonyme - 11 janv. 2008 à 20:49
bjr,,,j'ai réaliser un programme ,,, le probleme c'est que j'arrive pas à bien enregistrer les données dans un fichier (chaque nouveau ajout n'apparait pas , mais le premier s'ecrit à sa place)
voila le code :::::::::::
:::::::::::::::::::::::::

#include<stdio.h>
#include <myconio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>



struct facture /*structure */
{
char nom_de_l_article[60];
char code_aricle[30];
int quantite;
int prix_unitaire[30];
};

char nom_fichier[25]="facture.dat"; /* fichier1 pour enregistrer les materiaux.*/

int main()
{ /*page de garde*/


void Ajout(char *nom_fon);/*prototype fonction ajout .*/
void Affichage(char *nom_fon); /*prototype fonction affichage, qui affice les enregistrements*/

int ch;
clrscr() ;
do
{
clrscr() ;
gotoxy(27,2);
printf("** GESTION D'UNE facture ** ");
gotoxy(3,6);
printf("(1) Ajouter un nouveau article.");
gotoxy(3,10);
printf("(3) Afficher les articles. ");
printf("(6) Quitter.");
gotoxy(3,20);
printf("votre choix: ? ");
scanf("%d",&ch);
getchar();
switch (ch)
{
case 1:Ajout(nom_fichier); /* appelle du fonction ajout.*/
break;

case 3:Affichage(nom_fichier);
break;

}
}
while(ch!=6);
clrscr() ;

gotoxy(17,21);
printf("presser ENTRER pour quitter definitivement:");
getchar();
}}


void Ajout(char *nom_fon) /* fonction ajout */
{
FILE* Ahmed; /*creation d'un fichier*/
char c;
int i;
facture carte; /* definir un pointeur sur x(enregistrement)*/
Ahmed=fopen(nom_fon,"a"); /* ouverture d'un fichier en mode "a" Ajout*/
clrscr() ;
do
{
printf("\n nom de l article : ");
scanf("%s",carte.nom_de_l_article);
fflush( stdin ) ;
printf("\n code de l'article : ");
scanf("%s",&carte.code_aricle);
fflush( stdin ) ;
printf("\n la quantité : ");
scanf("%d",&carte.quantite);
fflush( stdin ) ;
printf("\n le prix unitaire : ");
scanf("%d",carte.prix_unitaire);
fflush( stdin ) ;
fwrite(&carte,sizeof(facture),2,Ahmed);
printf("\n nouvelle entr‚e?(o - n)");
c=getchar();
}
while(c=='o');
fclose(Ahmed); /*fermeture de fichier (Ahmed)*/
}


void Affichage(char *nom_fon) /* La fonction affichage*/
{
clrscr() ;
FILE* Ahmed1;
int j,i,d,t,k;
struct facture *X;
Ahmed1=fopen(nom_fon,"r+");
t=sizeof(facture);
fseek(Ahmed1,0,2);
d=ftell(Ahmed1)/t;
X=(facture *) malloc(sizeof(facture));
fseek(Ahmed1,0,0);
clrscr() ;
gotoxy(2,1);
printf("nom de l'article");
gotoxy(28,1);
printf("|");
gotoxy(29,1);
printf("code");
gotoxy(43,1);
printf("|");
gotoxy(44,1);
printf("quantite");
gotoxy(56,1);
printf("|");
gotoxy(57,1);
printf("prix_unitaire");
printf("\n -------------------------------------------------------------------------------");
j=1;
k=10;
for(i=0;i<d;i++)
{
if(i==0)
j=i+3;
fread(X,sizeof(facture),1,Ahmed1);
gotoxy(3,j);
printf("%s",X->nom_de_l_article);
gotoxy(28,j);
printf("|");
gotoxy(35,j);
printf("%s",X->code_aricle);
gotoxy(43,j);
printf("|");
gotoxy(48,j);
printf("%d",X->quantite);
gotoxy(56,j);
printf("|");
gotoxy(60,j);
printf("%d",X->prix_unitaire);
if(i==k)
{printf("\n"); gotoxy(1,24); printf(" --------------------------------------------------page Suivante:Appuiyer ENTRER"); }
else printf("\n -------------------------------------------------------------------------------");
j=j+1;
j=j+1;
if (i==k)
{
getchar();
clrscr() ;
gotoxy(1,1);
printf("nom de l'article");
gotoxy(29,1);
printf("code");
gotoxy(44,1);
printf("quantite");
gotoxy(60,1);
printf("prix_unitaire");
printf("\n -----------------------------------------------------------------------------");
j=3;
k=11+k;
}
}
printf("\n \nle nombre d'enregistrements est : %d",i);
fclose(Ahmed1);
getchar();
}
A voir également:

12 réponses

c'est le premier ajout qui est recopié ou c'est la premiere facture affichée dans ton fichier ?

par contre y'a une question que je me pose
est-ce que le 2 est bon dans ca
j'aurais mis 1 mais je suis pas sur de ca

fwrite(&carte,sizeof(facture),2,Ahmed);
0
Utilisateur anonyme
11 janv. 2008 à 14:19
tu as raison ,,, il suffit qu'il y aura "1",,, mais cela ne fait pas resoudre ,,,,(2= afficher 2fois)
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 janv. 2008 à 15:09
essaye en metant "a+"
0
Utilisateur anonyme
11 janv. 2008 à 16:38
voila une version plus corrigé du code



#include<stdio.h>
#include <myconio.h>
#include<stdlib.h>
#include<string.h>



struct facture /*structure */
{
char nom_de_l_article[60];
char code_aricle[30];
int quantite;
char prix_unitaire[30];
};

char nom_fichier[25]="facture.txt"; /* fichier1 pour enregistrer les materiaux.*/

int main()
{ /*page de garde*/
clrscr() ;/*effa‡e totalement l'ecran.*/

clrscr() ;
textattr(9);
textcolor(YELLOW);
clrscr() ;
gotoxy(13/2,5); /* permet au curseur d'aller au coordonn‚e entre().*/
printf("*****************...universite abdelmalek essaadi...******************");
gotoxy(10,7);
printf("*********************..FST-Tanger..************************");
gotoxy(6,9);
printf("********************.La GESTION D'une facture.*******************");
gotoxy(15,15);
textcolor(15);
printf("**** REALISE PAR : adil et mohamed *****\n");
gotoxy(18,22);
printf("presser ENTRER pour avoir les choix: ");
getchar();

{
void Ajout(char *nom_fon);/*prototype fonction ajout .*/
void Affichage(char *nom_fon); /*prototype fonction affichage, qui affice les enregistrements*/

void Rechercher(char *nom_fon);/* prototype de fonction recherche qui recherche un enregistrement dans le fichier "Materiel.don".*/

int ch;
clrscr() ;
do
{
clrscr() ;
gotoxy(27,2);
printf("** GESTION D'UNE facture ** ");
gotoxy(3,6);
printf("(1) Ajouter un nouveau article.");
gotoxy(3,8);
printf("(2 Afficher les articles. ");

gotoxy(44,6);
printf("(3) Rechercher un article.");
gotoxy(44,8);

printf("(4) Quitter.");
gotoxy(3,20);
printf("votre choix: ? ");
scanf("%d",&ch);
getchar();
switch (ch)
{
case 1:Ajout(nom_fichier); /* appelle du fonction ajout.*/
break;


case 2:Affichage(nom_fichier);
break;


case 3:Rechercher(nom_fichier);
break;

}
}
while(ch!=4);
clrscr() ;

gotoxy(17,21);
printf("presser ENTRER pour quitter definitivement:");
getchar();
}}


void Ajout(char *nom_fon) /* fonction ajout */
{
FILE* Ahmed; /*creation d'un fichier*/
char c;
int i;
facture carte; /* definir un pointeur sur x(enregistrement)*/
Ahmed=fopen(nom_fon,"a+"); /* ouverture d'un fichier en mode "a" Ajout*/
clrscr() ;
rewind(Ahmed);

do
{

printf("\n nom de l article : ");
scanf("%s",carte.nom_de_l_article);
fflush( stdin ) ;
printf("\n code de l'article : ");
scanf("%s",&carte.code_aricle);
fflush( stdin ) ;
printf("\n la quantité : ");
scanf("%d",&carte.quantite);
fflush( stdin ) ;
printf("\n le prix unitaire : ");
scanf("%s",&carte.prix_unitaire);
fflush( stdin ) ;
fwrite(&carte,sizeof(facture),1,Ahmed);


printf("\n nouvelle entr‚e?(o - n)");
c=getchar();
fclose(Ahmed);
Ahmed=fopen(nom_fon,"a");
rewind(Ahmed);
}
while(c=='o');
fclose(Ahmed); /*fermeture de fichier (Ahmed)*/
}

void Affichage(char *nom_fon) /* La fonction affichage*/
{
clrscr() ;
FILE* Ahmed1;
int j,i,d,t,k;
facture carte ;
Ahmed1=fopen(nom_fon,"r+");
t=sizeof(facture);
fseek(Ahmed1,0,2);
d=ftell(Ahmed1)/t;

fseek(Ahmed1,0,0);
clrscr() ;
gotoxy(2,1);
printf(" nom de l'article");
gotoxy(28,1);
printf("|");
gotoxy(29,1);
printf(" code");
gotoxy(43,1);
printf("|");
gotoxy(44,1);
printf(" quantite");
gotoxy(56,1);
printf("|");
gotoxy(57,1);
printf(" prix_unitaire (DH)");
printf("\n -------------------------------------------------------------------------------");
j=1;
k=10;



for(i=0;i<d;i++)
{

if(i==0)
j=i+3;
fread(& carte,sizeof(facture),1,Ahmed1);
gotoxy(3,j);
printf("%s",carte.nom_de_l_article);
gotoxy(28,j);
printf("|");
gotoxy(35,j);
printf("%s",carte.code_aricle);
gotoxy(43,j);
printf("|");
gotoxy(48,j);
printf("%d",carte.quantite);
gotoxy(56,j);
printf("|");
gotoxy(60,j);
printf("%s",carte.prix_unitaire);
if(i==k)
{printf("\n"); gotoxy(1,24); printf(" --------------------------------------------------page Suivante:Appuiyer ENTRER"); }
else printf("\n -------------------------------------------------------------------------------");
j=j+1;
j=j+1;
if (i==k)
{
getchar();
clrscr() ;
gotoxy(1,1);
printf("nom de l'article");
gotoxy(29,1);
printf("code");
gotoxy(44,1);
printf("quantite");
gotoxy(60,1);
printf("prix_unitaire (DH)");
printf("\n -----------------------------------------------------------------------------");
j=3;
k=11+k;
}
}

printf("\n \nle nombre d'enregistrements est : %d",i);
fclose(Ahmed1);
getchar();
}



void Rechercher(char *nom_fon)
{
FILE *Ahmed5;
facture *x;
int i,t,n,j; int a;
char ch[20];
clrscr() ;
printf("\n donner le nom de l'rticle ");
scanf("%s",ch);
getchar();
Ahmed5=fopen(nom_fon,"r+");
t=sizeof(facture);
fseek(Ahmed5,0,2);
n=ftell(Ahmed5)/t;
fseek(Ahmed5,0,0);
x=(facture*)malloc(t);
i=0;
do
{
fread(x,1,t,Ahmed5);
i++;
}
while(strcmp(x->nom_de_l_article,ch)!=0 && i<=n);
if(strcmp(x->nom_de_l_article,ch)==0)
{
gotoxy(1,5);
printf("*nomMateriel:%s",x->nom_de_l_article);
gotoxy(25,5);
printf("*ref:%s",x->code_aricle);
gotoxy(44,5);
printf("*Type:%d",x->quantite);
gotoxy(60,5);
printf("*Atelier:%d\n",x->prix_unitaire);
getchar();
}
else printf("\n code no trouv‚.");
getchar();
fclose(Ahmed5);
}
0

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

Posez votre question
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 janv. 2008 à 16:41
il marche ou pas ?
0
Utilisateur anonyme
11 janv. 2008 à 16:46
non ca marche pas
0
Utilisateur anonyme
11 janv. 2008 à 16:50
puisque la taille du fichier augmente chaque fois je fais unenregistrement donc la fonction ''ajouter " marche bien ,,,
le probleme c'set dans la foction affichage : je dois mette le curseur en haut du fichier et le parcourire jusqu'à la fin

viola la foction

struct facture /*structure */
{
char nom_de_l_article[60];
char code_aricle[30];
int quantite;
char prix_unitaire[30];
};


void Affichage(char *nom_fon) /* La fonction affichage*/
{
clrscr() ;
FILE* Ahmed1;
int j,i,d,t,k;
facture carte ;
Ahmed1=fopen(nom_fon,"r+");
t=sizeof(facture);
fseek(Ahmed1,0,2);
d=ftell(Ahmed1)/t;

fseek(Ahmed1,0,0);
clrscr() ;
gotoxy(2,1);
printf(" nom de l'article");
gotoxy(28,1);
printf("|");
gotoxy(29,1);
printf(" code");
gotoxy(43,1);
printf("|");
gotoxy(44,1);
printf(" quantite");
gotoxy(56,1);
printf("|");
gotoxy(57,1);
printf(" prix_unitaire (DH)");
printf("\n -------------------------------------------------------------------------------");
j=1;
k=10;



for(i=0;i<d;i++)
{

if(i==0)
j=i+3;
fread(& carte,sizeof(facture),1,Ahmed1);
gotoxy(3,j);
printf("%s",carte.nom_de_l_article);
gotoxy(28,j);
printf("|");
gotoxy(35,j);
printf("%s",carte.code_aricle);
gotoxy(43,j);
printf("|");
gotoxy(48,j);
printf("%d",carte.quantite);
gotoxy(56,j);
printf("|");
gotoxy(60,j);
printf("%s",carte.prix_unitaire);
if(i==k)
{printf("\n"); gotoxy(1,24); printf(" --------------------------------------------------page Suivante:Appuiyer ENTRER"); }
else printf("\n -------------------------------------------------------------------------------");
j=j+1;
j=j+1;
if (i==k)
{
getchar();
clrscr() ;
gotoxy(1,1);
printf("nom de l'article");
gotoxy(29,1);
printf("code");
gotoxy(44,1);
printf("quantite");
gotoxy(60,1);
printf("prix_unitaire (DH)");
printf("\n -----------------------------------------------------------------------------");
j=3;
k=11+k;
}
}

printf("\n \nle nombre d'enregistrements est : %d",i);
fclose(Ahmed1);
getchar();
}
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 janv. 2008 à 16:50
c'est quoi exactement le probleme ?
erreur de compilation ? si oui quel message d'erreur ?
ou pas d'erreur de compilation mais le programme fait pas ce que tu veux ?
0
Utilisateur anonyme
11 janv. 2008 à 16:52
non il s'execute correctement mais qd je veux afficher mes enregistrements, il affiche le premier 2 fois ,, quand je fais un nouveau enregistrement il affiche le prmier 3 fois et ainsi de suite......
0
Utilisateur anonyme
11 janv. 2008 à 17:00
il fallait signaler que devc++ ne reconnait pa
textattr();
textcolor();
clrscr() ;
gotoxy()

donc j'ai ajouter dans le fichier inclue une bibliothèque myconio.h pour executer le programme ,,, donc je sais pas si vous arriver à le compiler .
si vous vouler cette fonction vous la copier dans le fichier include sous " myconio.h"


// Nom du fichier : myconio.h
// Auteur : prof.geii37@laposte.net
// Version : Novembre 2004
// Objectif : remédier à l'absence de certaines fonctions conio sous DevC++

/* Remarques :
- Dev-C++ possède déjà une bibliothèque conio dans laquelle les fonctions
« getch », « getche », « kbhit », « putch » et « ungetch » sont codées.
- « textmode n'a pas été réécrite car les modes d'affichage prévus sous DOS
n'ont pas de sens dans une fenêtre console Windows.
- « window » n'a pas pu être écrite... seule une fonction « MYclrwin » a été
codée pour remplacer l'appel de « window » suivi d'un « clrscr ».
Toutefois la zone d'écriture à l'écran n'est pas limitée.
- « MYwindow » redimensionne la fenêtre de la console.
A noter : le comportement de cette fonction n'a aucun rapport avec celui
de « window » de conio.
*/

#ifndef _MYCONIO_H_
#define _MYCONIO_H_

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

#include <stdarg.h>
#include <windef.h>
#include <winbase.h>
#include <wincon.h>

#ifdef __cplusplus
extern "C" {
#endif

struct text_info {
unsigned char winleft;
unsigned char wintop;
unsigned char winright;
unsigned char winbottom;
unsigned char attribute;
unsigned char normattr;
unsigned char currmode;
unsigned char screenheight;
unsigned char screenwidth;
unsigned char curx;
unsigned char cury;
};

enum COLORS { BLACK, BLUE, GREEN, CYAN, RED, MAGENTA, BROWN, LIGHTGRAY,
DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED,
LIGHTMAGENTA, YELLOW, WHITE } ;

#define _NOCURSOR 0
#define _SOLIDCURSOR 1
#define _NORMALCURSOR 2
#define C40 1

void _setcursortype(int type);
char *cgets(char *str);
void clreol();
void clrscr();
void delline();

#define cprintf printf
#define cscanf scanf
/* Les fonctions « cprintf » et « cscanf » n'ont pas été réécrites, ceci est
peut-être une erreur...
En effet, « scanf » lit les données à partir de « stdin » et les fonctions
d'entrée de la console lisent les données à partir de « STD_INPUT_HANDLE ».
Or il semblerait que « fflush(stdin) ; » n'ait pas le même effet que
« FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE)) ; »...
A suivre... */

int cputs(const char *str) ;

int Gettext(int left, int top, int right, int bottom, void *destin) ;
#define gettext Gettext
/* Cette astuce a dû être utilisée car la ligne
« int gettext(int left, int top, int right, int bottom, void *destin) ; »
produit un message d'erreur (sous Dev-C++) ! */

void gettextinfo(struct text_info *_r);

int MYgetch(void) ;
int MYgetche(void) ;
/* « getch », « getche » sont déjà définies dans <conio.h> (mingw). Cependant,
au même titre que « getchar » (stdio) ne consomme pas le caractère <CR>,
elles ne consomment pas le caractère saisi par l'utilisateur (c'est à dire :
elles n'enlèvent pas le caractère du buffer d'entrée). « MYgetch »,
« MYgetche » vident le buffer. Attention, « MYgetch » et « MYgetche »
n'enlèvent pas un caractère, mais tous les caractères disponibles. Grâce
aux directives « #define » inclus dans MYconio.cpp, ce sont les fonctions
« MYgetch » et « MYgetche » qui seront appelées si dans un source on fait
appel à « getch » ou « getche ». */

void gotoxy(int x, int y);

void highvideo();
void insline();
// kbhit : OK déjà défini dans <conio.h> (mingw)
void lowvideo();
int movetext(int left, int top, int right, int bottom, int destleft, int desttop);
void normvideo();
// putch : OK déjà défini dans <conio.h> (mingw)
int puttext(int left, int top, int right, int bottom, void *source);

void textattr(int _attr);
void textbackground(int _color);
void textcolor(int _color);
/* BLINK (clignotement) ne fonctionne pas ! Par contre, il est possible
d'utiliser les oucleurs LIGHT pour le fond d'écran, ce qui n'est pas le cas
pour une application DOS.*/

/* « void textmode(int _mode); » n'a pas été réécrite, car les modes
d'affichage DOS n'ont aucun sens dans une application console Windows. */
// ungetch : OK déjà défini dans <conio.h> (mingw)
int wherex();
int wherey();

void MYclrwin(int left, int top, int right, int bottom); // efface une zone
/* La fonction « window » de conio est fréquemment utilisée (suivi de
« clrscr ») pour effacer une zone de l'écran et modifier sa couleur en
fonction des attribus mis à jour par « textcolor » ou « textbackground ».
« MYclrwin » permet cela, mais elle n'interdit pas d'écrire en dehors
de cette zone.*/

void MYwindow(int left, int top, int right, int bottom);
/* « MYwindow » permet de redimensionner la fenêtre de la console. Cependant,
ce comportement, n'est pas celui de la fonction « window » de conio */

// void window(int left, int top, int right, int bottom);

#ifdef __cplusplus
}
#endif

#include <myconio.cpp>
#endif //_MYCONIO_H_
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
11 janv. 2008 à 19:47
tu es sure que c'est la fonction affiche qui pose probleme et pas la fonction ajout tu as regarder le contenu de ton fichier texte pour oir s'il était correct ?
0
Utilisateur anonyme
11 janv. 2008 à 20:49
en fait le fichier est illisible ,, mais quand je ferme le programe et j'ajoute de nouveux enregistrements la taille du fichier augmente ,, donc le probleme réside dans la foction d'affichage
0