C文件打开错误

时间:2015-02-11 10:39:46

标签: c

我在c中创建了这个程序。用户输入'lieunaissance'然后我们打开一个格式化的文件来搜索'lieunaissance'值。

问题是,当程序尝试打开文件时,我收到一条错误消息。

我应该如何访问该文件?

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

2 个答案:

答案 0 :(得分:3)

此:

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

是非常错误的,它试图将函数的地址(!)转换为指向结构的指针,但也会进行无限递归调用,这将会占用堆栈并导致未定义的行为。

应该是:

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

请注意,在C中不接受任何参数的函数应声明为(void)。另请注意,malloc()可能会失败,您需要在依赖它之前检查undepartement()的返回值。

答案 1 :(得分:1)

来自manpage

  

返回值          成功完成后,fopen(),fdopen()和freopen()返回一个          文件指针。否则,返回NULL并设置errno以指示          错误。

因此,您可能希望#include <errno.h>并在errno未能得到答案时检查fopen

我的猜测:也许您的文件Basedecommunes.txt不在正在运行的程序的同一目录中。