2015-02-11 197 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