IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

chercher dans mon fichier


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut chercher dans mon fichier
    J'ai un probleme avec mon fichier il ne trouve pas l'element que je veux qu'il trouve !!

    donc g une fonction qui enregistre les elements
    Ma structure
    struct hi chut[16];

    puis j'ouvre le fichier en WB(je dois travailler en binaire) pour ecraser si il y a deja des truc dans le fichier
    puis je fais sa pour entre les equipes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          for(i=0;i<16;i++)
           {
              printf("equipe %d",i+1);
              scanf("%s",chut[i].equipe);
              fwrite(&chut[i],sizeof(chut),1,f);
            }
    je ferme le fichier


    Puis dans une autre fonction j'ouvre le meme fichier en A+B

    j'affiche

    le 16 equipe là aucun probleme.
    puis ensuite je veux retrouve la position d'une equipe en particulier
    donc je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    printf("\nequipe1 : ");
    scanf("%s",a);
     
                      fread(&chut[i],sizeof(chut),1,f);
                      while(!feof(f))
                      {
                         if(strcmpi(a,chut[i].equipe)==0)       
                             {
                             pos1=i;
                             fread(&chut[i],sizeof(chut),1,f);
                             }
                             i++;
                       }
    //donc si l'equipe est
    //dans le fichier je note la
    //position pour l'utiliser apres
    // pour ajouter des infos


    Mais il me mets toujours 0 , la valeur d'initialisation de pos1.
    Quel est le probleme??

    Merci d'avance pour la reponse

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Première question, qu'y a-t-il dans la structure hi ? A quoi ressemble le champ équipe ?

    Sinon, j'ai l'impression que tu mixes mode binaire et mode texte :
    Tes fichiers sont ouverts en mode binaire, mais les comparaison se font en mode texte : le problème peut venir de là...


    Poste un code minimal qui compile et reproduit le problème.


    Enfin, la fonction feof ne fait pas ce que tu pense : On ne lit pas un fichier comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FILE * f = fopen("toto", "r");
     
    while(!feof(f)) {
        fgetc(f);
    }
    Mais comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    FILE * f = fopen("toto", "r");
    if(NULL == f) {
        perror("Erreur fichier");
    } else {
       int c = fgetc(f);
       while(EOF != c) {
          c = fgetc(f);
       } 
       if(feof(f)) {
           printf("Fin de fichier\n");
       }
       if(ferror(f)) {
           printf("Erreur pendant la lecture\n");
       }
        fclose(f);
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    voila ma structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct hi
    {char cat[30],equipe[30];
    int match_joue,gagne,perdu,nul,points;
    };
    //les int c pour faire un classement!! c pour cela qu'il me faut la position de l'equipe pour apres lui ajouter 3points en cas de victoire..........


    bha je fais comme cela pour le fichier j'ouvre avec fopen puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
              if(f==NULL)
                  printf("impossible d'ouvrir le fichier");
               else
               {    printf("\nequipe1 : ");
                     scanf("%s",a);
     
                      fread(&chut[i],sizeof(chut),1,f);
                      while(!feof(f))
                      {
                      if(strcmpi(a,chut[i].equipe)==0)       
                       {
                        pos1=i; //mais ici il ne prends pas la valeur du i c toujours zero
                        fread(&chut[i],sizeof(chut),1,f);
                        }
                        i++;
                       }
         ....//reste des instrcutions
     
    fclose(f);
    }

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Remets tu bien i à zéro avant de t'en servir ?

    Sinon, voici une explication de ma remarque sur feof : http://www.developpez.net/forums/d74...ix/#post498219

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Oui pour le i
    et surement que cela vient du feof parce que j'ai r'ajouté un printf pour voir si il rentre dans le if(strcmp) mais il rentre pas

    je dois mettre sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(&chut[i],sizeof(struct hi),f))
    a la place de

    Dis moi si je vois bien ce que c le feof
    Donc le programme regarde si l'equipe rentré correspond a une equipe de mon fichier et si il n'y a plus d'element ,il va jusqu'a la fin du fichier donc il s'arrete puisque je mets tant que different de fin de fichier je continue

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par rhcp88 Voir le message
    je dois mettre sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (fgets(&chut[i],sizeof(struct hi),f))
    Non, il ne faut pas se servir de fgets pour lire du binaire, il faut utiliser fread à la place.

    Sinon, je pense avoir trouvé la source du Problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(&chut[i],sizeof(chut),1,f);
    fread(&chut[i],sizeof(chut),1,f);
    A la lecture et l'enregistrement tu donnes la taille de chut, alors qu'il faudrait donner la taille d'un élément de chut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(&chut[i],sizeof *chut,1,f);
    fread(&chut[i],sizeof *chut,1,f);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fwrite(&chut[i],sizeof chut[i],1,f);
    fread(&chut[i],sizeof chut[i],1,f);

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    J'ai essayer tes deux solutions mais toujours le meme resusltat

    et quand je veux revenir au debut du fichier avec rewind(f); le programme plante donc je ne vois vraiement plus comment faire!

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Poste l'intégralité du code si c'est possible.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Donc ici pas de probleme je rentre les equipes puis quitte le fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    void aj_e()
    { 
      char n[10],str1[10], str2[10];
      int i;
      struct hi chut[16];
     
     
      printf("\nchanger les equipes dans quel categorie?");
      scanf("%s",str1);
      sprintf(str2,"%s.dat", str1);
      FILE *f;
      f=fopen(str2,"wb");       //donc ici j'ouvre avec le nom que le user entre
     
     
      if(f==NULL)
        printf("impossible d'ouvrir le fichier");    //je test
      else
      {
     
          for(i=0;i<16;i++)
           {printf("equipe %d",i+1);                 //je rentre le 16equpe
            scanf("%s",club[i].equipe);          //il n'y aura que 16 equipe par fichier
            fwrite(&chut[i],sizeof (chut),1,f);  //plus le points comme dans la struct
           }
      }
      fclose(f);  //je ferme
     
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void e_r()
    { char n[20],a[20],b[20],str1[10], str2[10];
      int i=0,ok=0,l=1,resl1,resl2,pos1=0,pos2=0,j=0;//c pour la suite
      struct hi chut[16];
     
     
      printf("\n ajouter resultat dans quel categorie?:");
      scanf("%s",str1);
      sprintf(str2,"%s.dat",str1);
      FILE *f;
      f=fopen(str2,"a+b");
     
               if(f==NULL)
                  printf("impossible d'ouvrir le fichier");
               else
               {              //ici j'affcihe tous les equpe du fichier(marche bien)
                   fread(&chut[i],sizeof (chut),1,f);
    	            while(!feof(f))
                      {  printf("\n%s",chut[i].equipe);
                         fread(&chut[i],sizeof (chut),1,f);
                      }
     
     
     
                   i=0;                                     //donc ici le user tape une equipe
                   printf("\nequipe1 : ");                    //je verifie si dans le ficher
                   scanf("%s",a);                            //si oui je prends sa position 
                      fread(&chut[i],sizeof (chut),1,f);  //pour utiliser plus tard
                      while(!feof(f))
                      {
                         if(strcmpi(a,chut[i].equipe)==0)
                             {
                             pos1=i;
                             printf("%d",i);
                             }
                             fread(&chut[i],sizeof (chut),1,f);
                             i++;
                       }                        
                   }
    Mais cela ne marche pas , on dirai que le If ne se fais pas puisque qu'il ne m'indique rien(quand il arrive au printf)

    Voila code complet ou j'ai mon probleme
    Apres je fais d'autre truc(qui sont en commentaire pour l'instant puisque le haut de programme ne marche pas) et puis ferme le fichier

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu n'as pas tenu compte des remarques de mabu un peu plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // les
       fwrite(&chut[i],sizeof (chut),1,f);  
    // et les  
       fread(&chut[i],sizeof (chut),1,f);
    sont incorrects : sizeof chut est 16 fois plus grand qu'un chut[i]. Tu devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       fwrite(&chut[i],sizeof *chut,1,f);  
    // et   
       fread(&chut[i],sizeof *chut,1,f);
    Pour le fwrite, tu vas écrire n'importe quoi à la fin du fichier (mais alors le append peut réserver des surprises) ou peut être tu accèderas à une zone mémoire pour laquelle tu n'as pas le droit et alors plantage.

    C'est fatal pour le fread car, à part pour chut[0], tu vas écrire des données à l'extérieur de ton tableau chut. Si tu as de la chance, ça va planter le programme et si tu n'as pas de chance, ça va modifier le contenu des variables placées derriere le tableau chut et le comportement du programme devient erratique.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Oui j'avais deja fais mais j'etait revenu a ma version parce que cela ne change rien

    Maintenant j'ai remplecé tous mais fwrite fread parce le *chut

    Mais lorsque je test si l'equipe que rentre le user et dans le fichier
    bha il ne m'affiche pas la valeur du i . Alors que je mets un printf et que je veux savoir la valeur du i pour savoir la position de l'equipe

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2009
    Messages : 9
    Par défaut
    Est ce que ce code peut marcher.En faite ici je demande toujours l'equipe que l'on veux recherche et ensuite avec fseek je prends la position actuel -1 pour revenir au debut du bloc.Et aussi je m'est ok à 1 quand il a trouvé l'equipe pour m'areter dans le fichier.
    Est ce que cela peut marché??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
                   i=0,ok=0;
                   gotoxy(18,16);
                   printf("equipe1 : ");
                   scanf("%s",a);
     
                      fread(&club[i],sizeof *club,1,f);
                      while(!feof(f)||ok==0)
                      {
     
                         fread(&club,sizeof *club,1,f);
                         if(strcmpi(a,club[i].equipe)==0)
                             {
                             ok=1;
                             }
                          fseek(f,-1L*sizeof *club,SEEK_CUR);
                      }

Discussions similaires

  1. Réponses: 9
    Dernier message: 04/05/2006, 17h33
  2. Réponses: 7
    Dernier message: 25/01/2006, 21h37
  3. lecture d'éléments dans mon fichier
    Par gillou4 dans le forum C
    Réponses: 9
    Dernier message: 23/10/2005, 16h19
  4. Saut de ligne dans mon fichier?
    Par cchampion2fr dans le forum Access
    Réponses: 1
    Dernier message: 14/09/2005, 16h22
  5. __declspec(dllexport) dans mon fichier header mais...?
    Par Jasmine dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 03/03/2004, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo