我在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));
}
答案 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
不在正在运行的程序的同一目录中。