gpt4 book ai didi

C文件打开错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:51 25 4
gpt4 key购买 nike

我用 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));
}

最佳答案

这个:

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() 的返回值。

关于C文件打开错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com