Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-50%
Le deal à ne pas rater :
-50% sur les sacs à dos pour ordinateur portable Urban Factory ...
19.99 € 39.99 €
Voir le deal

structure et tableau

2 participants

Aller en bas

structure et tableau Empty structure et tableau

Message  yerosnimus Ven 17 Juil 2009 - 15:32

Bonjour,

J'espère poster au bon endroit dans le forum.

Je réalise un programme dont une fonction parcourt des fichiers textes à la recherche de 2 informations. Pour chaque fichier ouvert, ces 2 infos sont enregistrées dans une variable de type structure.

Ci dessous mon main.c qui appelle la fonction Renommer() (fichier rename.c)

main.h
-------
Code:
#ifndef DEF_MAIN
#define DEF_MAIN

typedef struct InfoFichier InfoFichier;
struct InfoFichier
{
    char *NomAdh;
    char *NumAdh;
};

#endif

main.c
--------

Code:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "rename.h"

#define CHEMDESTTMP "C:\\tmptxt"

int main()
{

    InfoFichier *InfoFile[13];

    // Recherche des infos dans les fichiers textes
    int ResRen = Renommer(CHEMDESTTMP,&InfoFile);
    if (ResRen)
    {
        printf("Erreur dans l'appel de la fonction Renommer\n");
        exit(EXIT_FAILURE);
    }
   
    int i = 0;
    for (i=0;i<13;i++)
    {
        printf("%s\t%s\n", InfoFile[i]->NumAdh,InfoFile[i]->NomAdh);
    }

    return 0;

}
rename.h
---------
Code:
#ifndef DEF_RENAME
#define DEF_RENAME

int Renommer(const char *RepTxt,InfoFichier*);

#endif

rename.c
----------
Code:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "win_erreur.h"
#include "str.h"


int Renommer(const char *RepTxt,InfoFichier *InfFile[])
{

    WIN32_FIND_DATA File;
    HANDLE hSearch;

    char *tmp = NULL;          // Pointeur vers le répertoire contenant les fichiers texte à parser
    FILE *FichierTmp = NULL;    // handle contenant le fichier texte ouvert en lecture seule
    char *tmp2 = NULL;          // pointeur vers le chemin complet des fichiers texte

    char chaine[2999] = {NULL}; // contient la ligne du fichier texte
    size_t indexStart = -1;
    size_t indexEnd = -1;
    char *ResMotif = NULL;
    char *ResMotif2 = NULL;
    int cpt = 0;                // numero de ligne du fichier
    int i = 0;

    // Parcours des fichiers textes pour récupération du nom de l'adhérent et du numéro
    tmp = malloc(sizeof(*tmp) * (strlen(RepTxt) + 12));
    if (tmp == NULL)
    {
        printf("Erreur dans l'allocation de memoire du pointeur tmp\n");
        exit(EXIT_FAILURE);
    }
    sprintf(tmp,"%s\\*.txt",RepTxt);

    hSearch = FindFirstFile(tmp, &File);
    if (hSearch != INVALID_HANDLE_VALUE)
    {
        do {

            // Ouverture de chaque fichier texte pour retrouver le nom et le numero de l'adhérent
            tmp2 = malloc(sizeof(*tmp2) * (strlen(RepTxt) + strlen(File.cFileName) + 5));
            if (tmp2 == NULL)
            {
                printf("Erreur dans l'allocation de memoire du pointeur tmp2\n");
                exit(EXIT_FAILURE);
            }
            sprintf(tmp2,"%s\\%s",RepTxt,File.cFileName);

            FichierTmp = fopen(tmp2,"r");

            if (FichierTmp != NULL)
            {
                printf("Ouverture du fichier : %s\n", File.cFileName);
                cpt = 0;
                while (fgets(chaine, 2999, FichierTmp) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
                {
                    cpt++;
                    if (cpt == 9)
                    {
                        printf("Ligne n : %d\n",cpt);
                        ResMotif = strstr(chaine,"que ");
                        indexStart = ResMotif - chaine + 4;

                        ResMotif2 = strstr(chaine," est ");
                        indexEnd = ResMotif2 - chaine;

                        InfFile[i]->NomAdh = str_sub(chaine,indexStart,indexEnd);

                        ResMotif = strstr(chaine,"ro ");
                        indexStart = ResMotif - chaine + 4;

                        ResMotif2 = strstr(chaine," depuis");
                        indexEnd = ResMotif2 - chaine;

                        InfFile[i]->NumAdh = str_sub(chaine,indexStart,indexEnd);

                        i++;

                    }
                }
                fclose(FichierTmp);
            }
            else
            {
                printf("erreur dans l'ouverture du fichier\n");
            }

            free(tmp2);
            tmp2 = NULL;


            } while (FindNextFile(hSearch, &File));

        FindClose(hSearch);
    }

    free(tmp);
    tmp = NULL;

    return EXIT_SUCCESS;

}


Comme vous devez vous en douter, cela ne fonctionne pas. Le code fonctionne si je n'essaie pas d'utiliser un tableau pour conserver les données pour chaque fichier. Mais sitôt que j'essaie d'utiliser un tableau, plantage.

Comme je suis débutant en programmation et encore plus en C, j'avoue que je bloque un peu.

Merci d'avance de votre aide.

Cordialement,

Y.

yerosnimus

Messages : 3
Date d'inscription : 17/07/2009

Revenir en haut Aller en bas

structure et tableau Empty Début de solution

Message  yerosnimus Mar 21 Juil 2009 - 16:03

Bien, j'ai u peu avancé mais il reste quelques questions. Tout d'abord, voici les modifications apportées

Code:
int main()
{
    WIN32_FIND_DATA File;
    HANDLE hSearch;

    char *ChemSrc = NULL;          // Chemin des fichiers PDF
    char *Commande = NULL;          // Commande pdftotext arg1 arg2
    char *ChemCherche = NULL;      // Reçoit le motif de recherche '...\*.pdf'
    char *FichierTxt = NULL;  // correspond à l'argument 2 de la commande pdftotext
    size_t index = -1;
    int cpt = 0;                    // compteur pour nommer les fichiers textes temporaires

    InfoFichier InfoFile[13];

  [...]

    // Recherche des infos dans les fichiers textes
    int ResRen = Renommer(CHEMDESTTMP,&InfoFile);
    if (ResRen)
    {
        printf("Erreur dans l'appel de la fonction Renommer\n");
        exit(EXIT_FAILURE);
    }

    int i = 0;
    for (i=0;i<13;i++)
    {
        printf("%s\t%s\n", InfoFile[i].NumAdh,InfoFile[i].NomAdh);
    }

    return 0;

}

Et dans la fonction rename.c

Code:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#include "win_erreur.h"
#include "str.h"


int Renommer(const char *RepTxt,InfoFichier* InfFile)
{

    WIN32_FIND_DATA File;
    HANDLE hSearch;

    char *tmp = NULL;          // Pointeur vers le répertoire contenant les fichiers texte à parser
    FILE *FichierTmp = NULL;    // handle contenant le fichier texte ouvert en lecture seule
    char *tmp2 = NULL;          // pointeur vers le chemin complet des fichiers texte

    char chaine[2999] = {NULL}; // contient la ligne du fichier texte
    size_t indexStart = -1;
    size_t indexEnd = -1;
    char *ResMotif = NULL;
    char *ResMotif2 = NULL;
    int cpt = 0;                // numero de ligne du fichier
    int i = 0;

    // Parcours des fichiers textes
    tmp = malloc(sizeof(*tmp) * (strlen(RepTxt) + 12));
    if (tmp == NULL)
    {
        printf("Erreur dans l'allocation de memoire du pointeur tmp\n");
        exit(EXIT_FAILURE);
    }
    sprintf(tmp,"%s\\*.txt",RepTxt);

    hSearch = FindFirstFile(tmp, &File);
    if (hSearch != INVALID_HANDLE_VALUE)
    {
        do {

            // Ouverture de chaque fichier texte
            tmp2 = malloc(sizeof(*tmp2) * (strlen(RepTxt) + strlen(File.cFileName) + 5));
            if (tmp2 == NULL)
            {
                printf("Erreur dans l'allocation de memoire du pointeur tmp2\n");
                exit(EXIT_FAILURE);
            }
            sprintf(tmp2,"%s\\%s",RepTxt,File.cFileName);

            FichierTmp = fopen(tmp2,"r");

            if (FichierTmp != NULL)
            {
                printf("Ouverture du fichier : %s\n", File.cFileName);
                cpt = 0;
                while (fgets(chaine, 2999, FichierTmp) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
                {
                    cpt++;
                    if (cpt == 9)
                    {
                        printf("Ligne n : %d\n",cpt);
                        ResMotif = strstr(chaine,"que ");
                        indexStart = ResMotif - chaine + 4;

                        ResMotif2 = strstr(chaine," est ");
                        indexEnd = ResMotif2 - chaine;

                        InfFile[i].NomAdh = str_sub(chaine,indexStart,indexEnd);

                        ResMotif = strstr(chaine,"ro ");
                        indexStart = ResMotif - chaine + 4;

                        ResMotif2 = strstr(chaine," depuis");
                        indexEnd = ResMotif2 - chaine;

                        InfFile[i].NumAdh = str_sub(chaine,indexStart,indexEnd);

                        i++;

                    }
                }
                fclose(FichierTmp);
            }
            else
            {
                printf("erreur dans l'ouverture du fichier\n");
            }

            free(tmp2);
            tmp2 = NULL;


            } while (FindNextFile(hSearch, &File));

        FindClose(hSearch);
    }

    free(tmp);
    tmp = NULL;

    return EXIT_SUCCESS;

}

J'ai 2 questions :

1/ Je déclare mon tableau de structure avec une taille fixe (13 dans l'exemple ci-dessous). J'aimerai faire une allocation dynamique sans perdre mes données. Je pense qu'il faudrait passer par la commande realloc ? Des pistes pour faire cela ?

2/ J'ai du mal à comprendre pourquoi mon code fonctionne. Ma structure contient deux variables qui contiennent du texte donc de longueur variable par définition. A aucun moment je ne lui indique la taille à réserver et pourtant, le système semble s'en sortir bien tout seul. Qu'est ce qui m'échappe ?

Cordialement,

Y.

yerosnimus

Messages : 3
Date d'inscription : 17/07/2009

Revenir en haut Aller en bas

structure et tableau Empty Re: structure et tableau

Message  -ed- Lun 27 Juil 2009 - 16:28

Je n'ai pas lu dans le détail, mais dans la structure InfoFichier, je vois 2 pointeurs. Comment sont-ils initialisés ?
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

structure et tableau Empty Re: structure et tableau

Message  yerosnimus Mar 28 Juil 2009 - 9:46

Bonjour,

Je ne les ai pas initialisés, Oups !!!

Cordialement,

Y.

yerosnimus

Messages : 3
Date d'inscription : 17/07/2009

Revenir en haut Aller en bas

structure et tableau Empty Re: structure et tableau

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser