0

I have created this program in c. The user type 'lieunaissance' and then we open a formatted file to search 'lieunaissance' value.

The problem is that when the program try to open the file, I get an error message.

How should I access the file?

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<stddef.h>
#define MAX_dpt 100000
#define CODE_NON_TROUVE "NON_TROUVE"

struct departement
{
char codeactuel[10];
char anciencode[10];
char nom[50];
struct departement *predecesseur ;
struct departement *successeur;
};
struct departement *debut_liste, *fin_liste;
struct departement *undepartement();
void ouvrir_fichier(char Nomfichier[]);
struct departement *recherche_dpt(char recherche_code[]);
struct departement tabdpt[MAX_dpt];
void ouvrir_fichier();

int main()
{
    char sexe, reponse, date[5], annee[3], mois[4], bidon[3],lieunaissance[30], ordre[4], struct1[6], struct2[6],nir1[12],nir[13],nir2[13], nirancien[13] ;
    int i, nombre, cle, reste,n;
    long int val;
    struct departement undpt, *pointeur;
    char code[10];

    scanf("%s",lieunaissance);

    // convertir lieu de naissance en majuscule et l'affecter à nom
    int k = 0;
    while(lieunaissance[k])
    {
        lieunaissance[k] = toupper(lieunaissance[k]);
        k++;
    }
    printf(lieunaissance);

    //Lire dans le fichier
    ouvrir_fichier("Basedecommunes.txt");
    pointeur = recherche_dpt(lieunaissance);
    undpt    = *pointeur;
    if (strcmp(undpt.codeactuel,CODE_NON_TROUVE)==0)
    {
        printf("Aucun ""%s"" n'a ete trouve \n",lieunaissance);
    }
    else
    {
        printf("Code actuel   : %s\n",undpt.codeactuel);
        printf("Code ancien   : %s\n",undpt.anciencode);
        printf("Nom du departement    : %d\n",undpt.nom);
    }
}

void ouvrir_fichier(char Nomfichier[])
{
    struct departement *ptmp, *prec, *succ;
    FILE *f1;
    int nb, lire;

    //printf("Entrez le nom du fichier :");
    //scanf("%s",Nomfichier);

    nb = 0;
    f1 = fopen(Nomfichier, "r");
    if (f1 == NULL)
    {
        printf("Probleme acces fichier\n");
    }
    else
    {
        while ((! feof(f1)) && (nb < MAX_dpt) )
        {
            ptmp = undepartement();
            lire = fscanf (f1, "%s %s %s", (*ptmp).codeactuel, (*ptmp).anciencode, (*ptmp).nom);
            if (lire != EOF)
            {
                (*ptmp).predecesseur = NULL ;
                (*ptmp).successeur   = NULL;
                if (debut_liste == NULL)
                {
                    debut_liste = ptmp;
                    fin_liste   = ptmp;
                }
                else
                {
                    (*fin_liste).successeur = ptmp;
                    (*ptmp).predecesseur    = fin_liste;
                    fin_liste               = ptmp;
                }
                nb++ ;
            }
        }
        /* if (! (nb < MAX_dpt) )
        {
        printf("Nb departement = %d \n",MAX_dpt);
        }
        printf("Nb dpt lu = %d\n",i); */
    }
    fclose(f1);
}


/*--- fonction de recherche --- */
struct departement *recherche_dpt(char recherche_code[])
{
    struct departement ptmp, *pointeur, *pactu;
    int trouve ;

    trouve   = 0;
    pointeur = undepartement();
    strcpy((*pointeur).codeactuel, CODE_NON_TROUVE);

    pactu = debut_liste;
    while ((!trouve) && (pactu != NULL))
    {
        ptmp  = (*pactu);
        pactu = (*pactu).successeur;

        trouve = ((strcmp(ptmp.codeactuel,recherche_code)) == 0) ;

        if (trouve)
        {
            *pointeur = ptmp ;
        }
    }

    return pointeur;
}

/* --- allocation m?moire d'une nouvelle structure --- */
struct departement *undepartement()
{
    return (struct departement *) undepartement(sizeof(struct departement));
}
8
  • 4
    What's your error message? Commented Feb 11, 2015 at 10:40
  • I get this message 'Probleme acces fichier' because f1= NULL (I think I have a problem with pointers : struct departement *undepartement() ) Commented Feb 11, 2015 at 10:44
  • 4
    What do you think undepartement() does? You need to malloc a pointer of type struct departement* and then return it. Commented Feb 11, 2015 at 10:47
  • You have a redundant declaration of ouvrir_fichier Commented Feb 11, 2015 at 10:49
  • @Netmaster enable compiler warnings. And read why is while (!feof(file)) always wrong. Commented Feb 11, 2015 at 10:51

2 Answers 2

3

This:

struct departement *undepartement()
{
    return (struct departement *) undepartement(sizeof(struct departement));
}

is very wrong, it tries to return the address of the function (!) converted to a pointer to a structure, but also does an infinite recursive call that will eat your stack and cause undefined behavior.

It should just be:

struct departement * undepartement(void)
{
    struct departement *p = malloc(sizeof *p);
    return p;
}

Note that functions accepting no arguments in C should be declared as (void). Also note that malloc() can fail, you need to check the return vaule of undepartement() before relying on it.

Sign up to request clarification or add additional context in comments.

1 Comment

It's not the only problem, look at ouvrir_fichier the function only allocates the structs and doesn't return any reference to them at all.
1

From manpage:

RETURN VALUE Upon successful completion fopen(), fdopen() and freopen() return a FILE pointer. Otherwise, NULL is returned and errno is set to indicate the error.

So you might want to #include <errno.h> and check errno when your fopen fails to have your answer.

My guess: maybe your file Basedecommunes.txt is not in the same directory of your running program.

1 Comment

Thank you, but, 'Basedecommunes.txt' is in the same directory of your running program.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.