ceyquem E falso sequitur quodlibet | voilà, j'ai fait un programme qui charge des fichiers de deux façons différentes (un index.txt chargé par ligne dans un tableau de tableaus de char (char**) et un fichier test.tex chargé dans un tableau de char (char*)).
dans le module de chargement, je lis sans problèmes sourcev[i] mais dans main.c j'ai une erreur de segmentation pour les mêmes i (tous). voici le code :
fichier texindex.c
Code :
- #include "texindex.h"
- void readIndexTxt(char* filename, int* indexc, char** indexv, Boolean verbose)
- {
- int i=0;
- FILE* f;
- //tampon de lecture
- char s[40];
-
- if((f=fopen(filename,"r" ))==NULL)
- {
- printf("Erreur d'ouverture du fichier %s\n",filename);
- exit(1);
- }
- //comptage des mots contenus dans le fichiers (un par ligne)
- (*indexc)=0;
- while((fgets(s,80,f))!=NULL) (*indexc)++; //ajout d'un mot
- //allocation mémoire
- indexv=malloc((*indexc)*sizeof(char[40]));
- //retour au début du fichier
- rewind(f);
- //remplissage de la liste de mots
- printf("Chargement de la liste de mots" );
- if(verbose) printf("\n" );
- while((fgets(s,80,f))!=NULL)
- {
- indexv[i]=s;
- if(verbose) printf("Chargement de : indexv[%d]\t:\t%s",i,indexv[i]);
- else printf("." );
- i++;
- }
-
- fclose(f);
- }
- void readSourceTeX(char* filename, int* sourcec, char* sourcev, Boolean verbose)
- {
- int i=0;
- FILE* f;
- //tampon de lecture
- char c;
- if((f=fopen(filename,"r" ))==NULL)
- {
- printf("\nErreur d'ouverture du fichier %s\n",filename);
- exit(1);
- }
- //chargement du fichier
- printf("\nChargement de la source non indexée" );
- //comptage du nombre de caractères
- (*sourcec)=0;
- while((c=getc(f))!=EOF) (*sourcec)++; //ajout d'un caractère
- //allocation mémoire
- sourcev=malloc((*sourcec)*sizeof(char));
- //retour au début du fichier
- rewind(f);
- //chargement en mémoire du fichier
- printf("\nChargement du fichier source" );
- while((c=getc(f))!=EOF)
- {
- sourcev[i]=c;
- if(verbose) printf("Chargement de : sourcev[%d]\t:\t%c\n",i,sourcev[i]);
- else printf("." );
- i++;
- }
- fclose(f);
- }
|
fichier principal : main.c
Code :
- #include<string.h>
- #include "texindex.h"
- #include "boolean.h"
- int main(int argc, char** argv)
- {
- int i,j;
- //options en vrac
- char* optionlist=NULL; //chaine des options
- char optionbuffer='-'; //utile pour extraire les options
- //options bien découpées...
- int optc=0; //nombre d'options
- char* optv; //liste des options
- //liste des options possibles :
- Boolean opt_v=FAUX; //mode verbose
- Boolean opt_c=FAUX; //mode copie
- //fichiers source, index et copie
- char* fsource=""; //fichier source TeX
- char* findex=""; //fichier index Txt
- char* fcopie=""; //fichier copie TeX si besoin
- //tableau des mots à indexer :
- int indexc=0;
- char** indexv;
- //fichier source :
- int sourcec=0; //nombre de caractères
- char* sourcev; //ligne de caractères
-
- switch(argc)
- {
- case 0:
- case 1:
- case 2:
- printf("Erreur, nombre d'arguments incorrect !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
- return EXIT_FAILURE;
- break;
- case 3:
- printf("3\n" );
- //normalement pas d'options...
- //tester l'existence des fichiers en argument
- fsource=argv[1];
- findex=argv[2];
- break;
- case 4:
- printf("4\n" );
- //normalement, une option et pas de copie
- optionlist=argv[1];
- fsource=argv[2];
- findex=argv[3];
- break;
- case 5:
- //normalement, une option dont c et il y a un fichier copie
- optionlist=argv[1];
- fsource=argv[2];
- findex=argv[3];
- fcopie=argv[4];
- break;
- default:
- printf("Erreur, nombre d'arguments incorrect !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
- return EXIT_FAILURE;
- break;
- }
- //vérification du - d'options s'il y a des options :
- if(optionlist!=NULL)
- {
- optionbuffer=optionlist[0];
- //découpage des options et allocation mémoire :
- optc=strlen(optionlist)-1;
- optv=malloc(sizeof(char));
- }
-
- if(optionbuffer!='-')
- {
- printf("Erreur de syntaxe !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
- return EXIT_FAILURE;
- }
- printf("nb args\t:\t%d\n",optc);
- for(i=0;i<optc;i++)
- {
- j=i+1;
- optionbuffer=optionlist[j];
- optv[i]=optionbuffer;
- switch(optionbuffer)
- {
- case 'c':
- opt_c=VRAI;
- break;
- case 'v':
- opt_v=VRAI;
- break;
- default:
- printf("Erreur, option invalide [%c] !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n",optionbuffer);
- return EXIT_FAILURE;
- }
- printf("option %d\t:\t%c\n",j,optv[i]);
- }
- printf("---\n" );
- printf("fichier source\t:\t%s\nfichier index\t:\t%s\nfichier copie\t:\t%s\nliste d'options\t:\t%s\n",fsource,findex,fcopie,optionlist);
-
- //c'est parti !
-
- //lecture du fichier d'index de mots :
- readIndexTxt(findex,&indexc,indexv,opt_v);
-
- printf("\nVérification :\n" );
- for(i=0;i<indexc;i++)
- {
- printf("%s\n",indexv[i]);
- }
- printf("\n" );
- return EXIT_SUCCESS;
-
- //lecture du fichier source .tex :
- readSourceTeX(fsource,&sourcec,sourcev,opt_v);
- printf("\nVérification :\n" );
- for(i=0;i<sourcec;i++)
- {
- printf("%c",sourcev[i]);
- }
- printf("\n" );
- return EXIT_SUCCESS;
- }
|
les erreurs ont lieu ici :
là ça marche :
while((c=getc(f))!=EOF)
{
sourcev[i]=c;
if(verbose) printf("Chargement de : sourcev[%d]\t:\t%c\n",i,sourcev[i]);
else printf("." );
i++;
}
là ça plante :
for(i=0;i<sourcec;i++)
{
printf("%c",sourcev[i]);
} Message édité par ceyquem le 16-03-2003 à 16:09:09
|