2015-02-11 163 views
0

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

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

我该如何访问该文件?

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

你的错误信息是什么? – dgilperez 2015-02-11 10:40:21

+0

我得到这个消息'Probleme acces fichier',因为f1 = NULL(我想我有一个指针的问题:struct departement * undepartement()) – Netmaster 2015-02-11 10:44:51

+4

你认为'undepartement()'做了什么?你需要给malloc一个'struct departement *'类型的指针,然后返回它。 – 2015-02-11 10:47:01

回答

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()

+0

这不是唯一的问题,看看'ouvrir_fichier'这个函数只分配结构,并且根本不返回任何引用。 – 2015-02-11 10:53:54

+0

是的,我解决了这个问题,谢谢! – Netmaster 2015-02-11 12:28:49

1

manpage

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

所以,你可能想#include <errno.h>和检查errno当你fopen未能得到答案。

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

+0

谢谢,但'Basedecommunes.txt'与您正在运行的程序位于同一个目录中。 – Netmaster 2015-02-11 12:27:39