分段故障倒带

时间:2012-07-25 20:19:59

标签: c

你能解释一下为什么在函数“recuperationdeNS”中倒回(f)后,我有一个分段错误? 函数“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);
    }



    }

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

可能导致问题:

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

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

if (*f == NULL)