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 :

Indexage d'un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Indexage d'un fichier
    Bonsoir à tous et à toutes !
    Cela fait maintenant plusieurs heures que je cherche une solution à mon problème.. Et je commence à en avoir un tout petit peu marre Je viens donc vous demander un peu de votre temps pour m'aider à résoudre mon problème ! Ce serait vraiment super sympa

    Bon, alors, j'essaye d'implémenter une fonction qui me permettra d'indexer mon fichier dans la RAM. La voici :

    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
    40
    41
    42
    void Indexation(Index *pIx){
        FILE *fp;
        Joueurs *Jr;
        short i = 0;
     
     
        fp = fopen(FILE_NAME_JOUEURS, "rb");
     
     
        Jr = (Joueurs *) malloc (sizeof(Joueurs));
     
     
        if(fp == (FILE *) NULL)
        {
            printf("Erreur d'ouverture du fichier !\n");
            printf ("Code de l'erreur : %d\n", errno);
            printf ("La signification de l'erreur est donc : %s\n", strerror(errno));
        }
        else
        {
            fread(&Jr, sizeof(Joueurs), 1, fp);
     
     
            while(!feof(fp) && i < MAXIND)
            {
                pIx->IdJoueur = Jr.IdJoueur;
                strcpy(pIx->Nom, Jr.Nom);
                pIx->indice = ftell(fp) - sizeof(Joueurs);
     
     
                fread(&Jr, sizeof(Joueurs), 1, fp);
                pIx++;
                i++;
            }
        }
     
     
        fclose(fp);
     
     
        free(Jr);
    }
    Mon problème se déroule à partir de la ligne 24, avec le while(!feof..). Je ne comprends pas pourquoi, peu importe le nombre d'enregistrements que j'ai dans mon fichier, après le fread il considère qu'il est à la fin du fichier et ne passe donc pas par le while ! J'ai bien vérifié ma fonction d'ajout, si je ne me trompais pas de fichier ni rien. Tout se passe correctement.. Mais ce foutu fread... Je ne comprends vraiment pas ce qui se passe :'(

    Quelqu'un pour éclairer ma lanterne ?

    Merci ! Bonne soirée !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Plusieurs erreurs dans ce code
    1. tu alloues Jr avant d'avoir détecté si le fichier a bien été ouvert (donc s'il ne l'a pas été, tu alloues pour rien)
    2. tu alloues Jr de 1 => quand tu as besoin d'un int, est-ce que tu fais int *i puis i=malloc(sizeof int) ???
    3. Tu utilises Jr comme si c'était une variable (Jr.Nom) alors que c'est un pointeur => Jr->Nom (t'as pas eu de warning ???). Ceci dit, si tu supprimes le pointeur ça sera bon.
    4. tu passes l'adresse de Jr à fread() alors que Jr est déjà une adresse !!!
    5. tu fais un fclose() même si le fichier n'a pas été ouvert

    Donc l'ensemble de ces erreurs fait que rien ne peut fonctionner comme tu le veux. Et ta gestion de lecture est bricolée. Une première lecture puis un while !feof() avec une seconde lecture dans la boucle. Autant supprimer les deux lectures mettre directement while (fread(...) > 0 && i < MAXIND). Pareil avec ton indice. Tu as fp placé au bon endroit. Tu fais un fread() donc fp est décalé de sizeof joueurs puis tu calcules ton indice sur la position précédente de fp. Tu ne pouvais donc pas mémoriser directement la position de fp avant qu'il ne soit déplacé !!!???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    @ Sve@r
    6. La condition else peut être supprimée (et donc on gagne une indentation et en lisibilité) si on met un return dans le if
    On ne craint rien, si on déplace ou supprime le malloc

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    6. La condition else peut être supprimée (et donc on gagne une indentation et en lisibilité) si on met un return dans le if
    Oui, c'est aussi ce que je fais mais bon, tel qu'il l'a écrit c'est correct

    De plus, il faut faire attention quand on prend cette habitude surtout si on commence à gérer plusieurs ressources car à chaque ressource non récupérée, il faut penser à libérer à chaque fois toutes les ressources précédentes avant de quitter
    Exemple
    Code c : 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
    void fonction()
    {
        if ((ressource1=fopen(...)) == NULL)
            return;
     
        if ((ressource2=malloc(...)) == NULL)
        {
            fclose(ressource1);
            return;
        }
     
        if ((ressource3=shmat(...)) == NULL)
        {
            free(ressource2);
            fclose(ressource1);
            return;
        }
     
        // etc etc jusqu'au final
        shmdt(ressource3);
        free(ressource2);
        fclose(ressource1)
    }

    Ou alors prendre le risque d'introduire du goto
    Code c : 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
    void fonction()
    {
        ressource1=NULL;
        ressource2=NULL;
        ressource3=NULL;
        if ((ressource1=fopen(...)) == NULL)
            goto fin;
     
        if ((ressource2=malloc(...)) == NULL)
            goto fin;
     
        if ((ressource3=shmat(...)) == NULL)
            goto fin;
     
        // etc etc jusqu'au final
        fin:
        if (ressource3) shmdt(ressource3);
        if (ressource2) free(ressource2);
        if (ressource1) fclose(ressource1)
    }

    Alors qu'avec son écriture, il n'y a ni répétition de code ni goto. C'est pour ça que certains puristes hurlent devant cette façon de faire...

    Citation Envoyé par foetus Voir le message
    On ne craint rien, si on déplace ou supprime le malloc
    Oui évidemment !!! Tout ce que j'ai cité ne sont pas que des erreurs fatales je le sais bien !!! Le malloc et son appel parfois inutile ne gênent pas mais bon, autant lui donner aussi les bonnes habitudes quoi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour vos conseils ! Je viens donc de faire quelques modifications et tout marche maintenant.

    @Sve@r, non, je n'ai pas eu de warning lorsque j'ai utilisé Jr.Nom !

    Bon, je vais continuer à me casser la tête avec mon programme Je vous souhaite une agréable soirée et vous remercie à nouveau pour votre aide !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. outils d'indexage des fichier PDF autre que Searcharoo
    Par zalalus dans le forum ASP.NET
    Réponses: 0
    Dernier message: 02/12/2009, 12h55
  2. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  3. Réponses: 5
    Dernier message: 20/08/2002, 18h01
  4. Lire 1 bit d'un fichier en C
    Par Anonymous dans le forum C
    Réponses: 3
    Dernier message: 23/05/2002, 18h31
  5. Fichier PDOXUSRS.NET
    Par yannick dans le forum Paradox
    Réponses: 5
    Dernier message: 05/04/2002, 09h45

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