2012-07-25 94 views
0

你能解释一下在“recuperationdeNS”函数中后退(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); 
    } 



    } 
+1

文件是否打开? – ardent 2012-07-25 20:23:31

回答

2

ouvrir_fic()你的文件打开检查故障:

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); 
    } 
} 

您应该检查*f是否为NULL;您已经假定在您进行作业时f不为空。

由于文件无法打开,因此您在*f中有空指针。

我可能会使用:

FILE *ouvrir_fic(const char *nom, const char *mode) 
{ 
    FILE *fp = fopen(nom, mode); 
    if (fp == NULL) 
    { 
     fprintf(stderr, "probleme lecture ou ecriture du fichier: %s\n", nom); 
     exit(2); 
    } 
    return(fp); 
} 
2

可以是导致该问题:

*f=fopen(nom,type); 
if(f==NULL) 

如果文件,如果打开(只检查if检查不检查f参数在使用后不为空)。如果fopen()失败,则文件指针将为NULL,并且它将不被检测到。检查应该是:

if (*f == NULL)