Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1837 connectés 

  FORUM HardWare.fr
  Programmation
  C

  c fichier

 

Sujet(s) à lire :
    - Visual C++
 

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

c fichier

n°1015101
jon_w748
Posté le 16-03-2005 à 20:13:46  profilanswer
 

j ai une fonction encodage et une lecture seulement lors de la lecture il ne lit que la derniere fiche saisie et pas tt les fiches ???
 
void encodage(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
   int i=0;
          fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
   while(i<nbr)
   {  
            fwrite(&nbutil,sizeof(int),1,fp);
            fwrite(&dermat,sizeof(int),1,fp);
     pb->pos=i;
     pt->matr=dermat+1;
            printf("entrez le nom\n" );
     fflush(stdin);
     gets(pt->nom);
            strcpy(pb->nom,pt->nom);
     fwrite(&pb,sizeof(*(pb)),1,fpi);
     fseek(fpi,0,SEEK_CUR);
     printf("entrez le prenom\n" );
     fflush(stdin);
     gets(pt->prenom);
     system("cls" );
            fseek(fp,0,SEEK_CUR);
     fwrite(&pt,sizeof(*(pt)),1,fp);
     i++;
     nbutil++;
     dermat++;  
   }
   fcloseall();
}
 
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
          fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
          {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
                         fread(&dermat,sizeof(int),1,fp);
                         printf("dernier matricule%d",dermat);
    printf("\n" );
                         fread(&pt,sizeof(*(pt)),1,fp);
                     printf("matricule:%d",(pt->matr));
                  printf("\n" );
                         puts(pt->nom);
                  puts(pt->prenom);
                  printf("\n" );
    i++;
                 nbutil++;
                 dermat++;
        }
            }
   
}
nbr c est le nombre de fiche sasie par l utilisateur .

mood
Publicité
Posté le 16-03-2005 à 20:13:46  profilanswer
 

n°1015102
jon_w748
Posté le 16-03-2005 à 20:14:12  profilanswer
 

void ajout(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
   while(i<nbr)
   {  
        fwrite(&nbutil,sizeof(int),1,fp);
        fwrite(&dermat,sizeof(int),1,fp);
     pb->pos=i;
     pt->matr=dermat+1;
        printf("entrez le nom\n" );
     fflush(stdin);
     gets(pt->nom);
        strcpy(pb->nom,pt->nom);
     fwrite(&pb,sizeof(*(pb)),1,fpi);
  fseek(fpi,0,SEEK_CUR);
     printf("entrez le prenom\n" );
     fflush(stdin);
     gets(pt->prenom);
     system("cls" );
        fseek(fp,0,SEEK_CUR);
     fwrite(&pt,sizeof(*(pt)),1,fp);
     i++;
  nbutil++;
     dermat++;  
   }
   fcloseall();
}
/************************************************************************
*I:ADRESSE DE DEBUT DE TABLEAU ET NOMBRE DE FICHE                       *
*P:TRI PAR VECTEUR D INDEX                                              *
*O:---------------------------------------------------------------------*
************************************************************************/
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
      {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
             fread(&dermat,sizeof(int),1,fp);
             printf("dernier matricule%d",dermat);
    printf("\n" );
             fread(&pt,sizeof(*(pt)),1,fp);
             printf("matricule:%d",(pt->matr));
          printf("\n" );
             puts(pt->nom);
          puts(pt->prenom);
          printf("\n" );
    i++;
          nbutil++;
          dermat++;
    }
      }
   
}

n°1015105
jon_w748
Posté le 16-03-2005 à 20:15:11  profilanswer
 

si j incremente mon pointeur de structure de fiche le programme plante lorsque je le quitte sans aucune raison ????

n°1015114
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-03-2005 à 20:20:00  profilanswer
 

jon_w748 a écrit :

si j incremente mon pointeur de structure de fiche le programme plante lorsque je le quitte sans aucune raison ????


  • struct INDEX, struct FICHE, c'est quoi ?
  • Tu as publié 2 fonctions 'affiche()'. Laquelle est la bonne ?
  • fflush(stdin) n'est pas défini par la norme. Il peut arriver n'importe quoi...
  • gets() est un bug qu'il ne faut pas utiliser. Pour des saisies correctes :


http://mapage.noos.fr/emdel/notes.htm#saisie


Message édité par Emmanuel Delahaye le 16-03-2005 à 21:12:56

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1015123
jon_w748
Posté le 16-03-2005 à 20:27:40  profilanswer
 

struct fiche une un structure de fiche {
matr
nom [20]
prenom[15]
}
pour le gets j ai deja modifier j utilise fgets je vai remettre la derniere version

n°1015125
jon_w748
Posté le 16-03-2005 à 20:28:50  profilanswer
 

void ajout(struct FICHE *pt, FILE *fp ,FILE *fpi,struct INDEX *pb,int nbutil,int dermat,int nbr)
{
 int i=0;
    fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
 fpi = fopen("C:\\fichier\\membre.ndx", "r+b" );
 while(i<nbr)
 {  
      fwrite(&nbutil,sizeof(int),1,fp);
      fwrite(&dermat,sizeof(int),1,fp);
   pb->pos=i;
   pt->matr=dermat+1;
      printf("entrez le nom\n" );
   fflush(stdin);
   fgets(pt->nom,20,stdin);
      strcpy(pb->nom,pt->nom);
      tri(pb,nbr);
      fseek(fpi,0,SEEK_CUR);
   fwrite(&pb,sizeof(pb),1,fpi);
   printf("entrez le prenom\n" );
   fflush(stdin);
   fgets(pt->prenom,15,stdin);
   system("cls" );
      fseek(fp,0,SEEK_CUR);
   fwrite(&pt,sizeof(pt),1,fp);    
   i++;
   nbutil++;
   dermat++;    
 }
 fcloseall();
}
 
void affiche(struct FICHE *pt,FILE *fp,struct INDEX *pb,FILE *fpi,int nbutil,int dermat,int nbr)
{
   int i=0;
      fp = fopen ("C:\\fichier\\membre.dat", "r+b" );
   if(fp!=NULL)
      {
    while(i<nbr)
    {
    fread(&nbutil,sizeof(int),1,fp);
    printf("nombre utile%d",nbutil);
    printf("\n" );
             fread(&dermat,sizeof(int),1,fp);
             printf("dernier matricule%d",dermat);
    printf("\n" );
             fread(&pt,sizeof(*(pt)),1,fp);
             printf("matricule:%d",(pt->matr));
          printf("\n" );
             puts(pt->nom);
          puts(pt->prenom);
          printf("\n" );
    i++;
          nbutil++;
          dermat++;
    }
      }
   
}
 

n°1015263
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-03-2005 à 21:19:10  profilanswer
 

jon_w748 a écrit :

struct fiche une un structure de fiche {
matr
nom [20]
prenom[15]
}
pour le gets j ai deja modifier j utilise fgets je vai remettre la derniere version


Manque le type de 'matr'.
 
Attention que fgets() laisse trainer le '\n'. Il y a un traitement 'intelligent' à faire...
 
D'autre part, je t'ai déjà dit que fflush (stdin) ne fonctionnait pas.
 
Autre chose. Tu utilises des paramètres comme variables locales. C'est inutilement complexe. Défini les en locales, et c'est tout. Tu n'a pas indiqué non plus comment tu appelais les fonctions (pas de  main())
 
Enfin, les fichiers doivent être ouverts en "rb" en lecture ou en "wb" en écriture. Le mélange des deux ("r+b", "w+b" ) mène souvent à la confusion et à la destruction des fichiers... fflushall() n'existe pas. Il faut fermer les fichiers proprement avec fclose().
 
Il n'y a probablement pas besoin de fseek()...
 
C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...


Message édité par Emmanuel Delahaye le 16-03-2005 à 21:33:52

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1015287
jon_w748
Posté le 16-03-2005 à 21:36:33  profilanswer
 

sous le compilateur visual studio 6.0 le fflush stdin permet de vider le buffer de clavier enfin c est ce que on nous a dit.
j ai essayer d increment mon pointeur de structure de fiche pt++; dans ajout et dans affichage il affiche comme il le faut mais lorsque dans mon menu je fait quitter il plante
 

n°1015361
Emmanuel D​elahaye
C is a sharp tool
Posté le 16-03-2005 à 22:56:12  profilanswer
 

jon_w748 a écrit :

sous le compilateur visual studio 6.0 le fflush stdin permet de vider le buffer de clavier enfin c est ce que on nous a dit.


Peut être, mais c'est une extension non portable. Ailleurs, au mieux ça ne fait rien, au pire, ça plante tout... C'est le propre d'un comportement indéfini...

Citation :


j ai essayer d increment mon pointeur de structure de fiche pt++; dans ajout et dans affichage il affiche comme il le faut mais lorsque dans mon menu je fait quitter il plante


Quel menu ? On ne connait pas l'ensemble du code...


Message édité par Emmanuel Delahaye le 16-03-2005 à 22:56:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1015379
farib
Posté le 16-03-2005 à 23:08:14  profilanswer
 

et avec les bonnes balises pour présenter le code, c'est mieux...


---------------
Bitcoin, Magical Thinking, and Political Ideology
mood
Publicité
Posté le 16-03-2005 à 23:08:14  profilanswer
 

n°1015560
plofplof
Posté le 17-03-2005 à 07:03:44  profilanswer
 

w000 so 31337 tout ces buffer overflow.
Aprend plutot a structurer ton code :)
 
‰?Ô¥#?|

n°1015569
db__
spécialiste de l'à peu près
Posté le 17-03-2005 à 08:04:59  profilanswer
 

Bonjour

Citation :

C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...  


Professionnelement je manipule tous les jours des fichiers de données textes de 5Go que je met en binaire pour faire 500Mo. Ces fichiers sont utilisables sur tous systèmes windows, mac, unix, linux et sur processeur grand boutien et petit boutien (little endian)
Le binaire est tout à fait portable si on s'en donne la peine et surtout infiniment plus compacte. Balader 500Mo de données par réseau lent est plus facile que 5Go quand à l'archivage !
le format tiff est je le crois un format binaire et il se lit partout.
Il est évident qu'il est plus facile de reconstruire la structure d'un fichier texte quand on ne la connais pas. Le binaire peut être un début de codage confidentiel de données.
Pour un débutant il vaut peut être mieux utiliser un fichier texte mais il ne faut pas se fermer la porte du binaire.
Cordialement

n°1015573
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 08:11:13  profilanswer
 

db__ a écrit :

Citation :

C'est pas une bonne idée de mettre des valeurs binaires dans un fichier. C'est confus et pas portable. On prefère nettement utiliser fprintf() et mettre des formats texte...  


Professionnelement je manipule tous les jours des fichiers de données textes de 5Go que je met en binaire pour faire 500Mo.


Il existe des format de données binaires portables (XDR, BER), mais leur mise en oeuvre un peu plus complexe que ce qui est proposé. Quand à l'optimisation, il est bien évident qu'il faut utiliser la compression (zip ou autre) avant de transmettre ou d'archiver des gros fichiers textes.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  c fichier

 

Sujets relatifs
ne pas ouvrir un fichier doc dans iefichier en lecture/ecriture
transformer un fichier de données en tableau[PHP] envoie fichier pb
tranfert de fichier vers client partir d'une page JSPEcrire dans un fichier
Lecture d'un fichier.txt dans une IHMTrouver la compression d'un fichier inconnu ?
insérer une image existante dans un fichier Wordupload de fichier volumineux (8 Mo voir 10 Mo)
Plus de sujets relatifs à : c fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR