你能解释一下为什么在函数“recuperationdeNS”中的 rewind(f) 之后,我有一个 Segmentation Fault 吗?函数“recuperationdeNS”中的第二个 printf 没有出现。分段错误之前停止了程序。我确定文件名没问题。
谢谢
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include"procedurecommune.h"
#include"procedureGenA.h"
#include"procedureGenO.h"
void ouvrir_fic(FILE** f, char* nom,char* type)
{
*f=fopen(nom,type);
if(f==NULL)
{
printf("probleme lecture ou ecriture du fichier : %s\n",nom);
exit(2);
}
}
int recuperationdeNS(FILE* fichG)
{
printf("aloooooooooo\n");
int i, N;
char chaine [2000];
rewind(fichG);
printf("aloooooooooo\n");
for(i=0;i<2;i++) // on saute les lignes de commentaires
{
fgets(chaine, sizeof chaine, fichG);
printf("chaine :%s\n",chaine);
}
fscanf(fichG, "%d",&N); // recuperation de N
return (N);
}
void recuperationnomfichiergena(FILE* fichG, char** NomFichierGenA, int nbligneasauter)
{
int i,c,iemecaractereligne;
rewind(fichG);
char chaine [Nmcl];
for(i=0;i<nbligneasauter;i++) // on saute les lignes de commentaires
{
fgets(chaine, sizeof chaine, fichG);
}
*NomFichierGenA=(char*) malloc (sizeof(char)*Nmcl);
fgets(chaine, sizeof chaine, fichG);
iemecaractereligne=0;
c=chaine[iemecaractereligne];
while(c != '\n')
{
c=chaine[iemecaractereligne];
if(c !='\n')
{
(*NomFichierGenA)[iemecaractereligne]=c;
}
iemecaractereligne++;
}
}
int determinationtypedegenchoisi(FILE* fichG);
int recuperationdeN(FILE* fichG);
void recuperationtabentiergenencours(FILE* fichG,int* genencours, int N);
void recuperationnomfichiergena(FILE* fichG, char ** nomfich,int nbligneasauter);
void main(int args, char **argv)
{
FILE * fichG=NULL;
FILE * fichM=NULL; //fichier contenant le contexte
FILE * fichMgenParAtt=NULL; //fichier contenant le contexte pregeneralise par attribut
FILE * fichGA=NULL; //fichier contenant la matrice de generalisation attribut
FILE * fichGO=NULL;
int** Matricegenereextraite;
int typedegen;
int i,nbligneMat,nbcolonneMat,nbgroupegeneralisant1,nbgroupegeneralisant2;
char NomUniqueFichierGen[Nmcm];
char chaine[Nmcl];
char* NomFichGenExtraitA;
char* NomFichGenExtraitO;
char* NomFichGenExtraitFinale;
char* NomFichierGenA ;
char* NomFichierGenO;
char* chaineNva;
char* chaineNvo;
int Na, No;
int N, Ni;
int* nbgroupegeneralisant;
int nbgroupegeneralisantmax;
const int nbligneenteteGparun = 5;//nombre de ligne pour acces nom fichier de gen attribut
const int nbligneenteteGpardeux = 8;//nombre de ligne pour acces nom fichier de gen objet
int* genencours;
NomFichGenExtraitA=argv[3];
NomFichGenExtraitO=argv[4];
NomFichGenExtraitFinale=argv[5];
chaineNva= argv[6];
chaineNvo= argv[7];
char dernierephrase[]="Name_of_dataset\n";
char* nomsdesobjets;
char** nomsdesgroupes;
char* nomsdesattributs;
int*** Matrice;
//Nva=chaineNva[0]-'0';
//Nvo=chaineNvo[0]-'0';
/// ouverture des fichiers
ouvrir_fic(&fichG, argv[2],"r");
ouvrir_fic(&fichM, argv[1],"r");
///////////////////////////////////////////////
//info du fichier Gen.txt
typedegen=determinationtypedegenchoisi(fichG);
printf("typedegen: %d\n",typedegen);
N=recuperationdeN(fichG);
printf("N: %d\n",N);
allocationdynamiquetableauunedimdentier(&genencours, N);
recuperationtabentiergenencours(fichG,genencours,N);
///////////////////recuperation choix de gen
//////////////////////////////////////////////////
//info du fichier Matrice.txt
nblignecolonneMat(fichM,&nbligneMat,&nbcolonneMat,dernierephrase);
printf("nbligneMat :%d, nbcolonneMat :%d\n",nbligneMat, nbcolonneMat);
///lecture du noms des objets et des attributs
objetsetattributs(fichM, &nomsdesobjets,&nomsdesattributs, dernierephrase);
printf("nomsdesO : %s\n",nomsdesobjets);
printf("nomsdesA : %s\n",nomsdesattributs);
//allocation dynamique
allocationdynamiquetableautroisdimdentier(&Matrice,N,nbligneMat,nbcolonneMat);
/// recuperation de la matrice de depart
recuperationmatrice (fichM, Matrice[0], nbligneMat, nbcolonneMat);
printf("\nMatrice 0:\n");
affichageMatrice(0, nbligneMat, 0, nbcolonneMat, Matrice[0]);
typedegen=1;
if(typedegen==1)
{
//////////////////////////////////////////
//info du fichier genO.txt
recuperationnomfichiergena(fichG, &NomFichierGenO,nbligneenteteGpardeux);
printf("fichier de generalisation utilise :%s\n ",NomFichierGenO);
ouvrir_fic(&fichGO, NomFichierGenO,"r");
No=recuperationdeNS(fichGO);
printf("No :%d\n",No);
}
}