structure et tableau
2 participants
Page 1 sur 1
structure et tableau
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
-------
--------
---------
----------
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.
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
--------
- 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;
}
---------
- Code:
#ifndef DEF_RENAME
#define DEF_RENAME
int Renommer(const char *RepTxt,InfoFichier*);
#endif
----------
- 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
Début de solution
Bien, j'ai u peu avancé mais il reste quelques questions. Tout d'abord, voici les modifications apportées
Et dans la fonction rename.c
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.
- 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
Re: structure et tableau
Je n'ai pas lu dans le détail, mais dans la structure InfoFichier, je vois 2 pointeurs. Comment sont-ils initialisés ?
Re: structure et tableau
Bonjour,
Je ne les ai pas initialisés, Oups !!!
Cordialement,
Y.
Je ne les ai pas initialisés, Oups !!!
Cordialement,
Y.
yerosnimus- Messages : 3
Date d'inscription : 17/07/2009
Sujets similaires
» structure doublement chainee
» Tableau a deux dimensions.
» lecture tableau texte 2D erreur de segmentation
» Tableau a deux dimensions.
» lecture tableau texte 2D erreur de segmentation
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum