我需要一种方法来存储文件中的数据并将其保存在文件中,这一切都需要使用指针通过列表来完成,因为菜单指定它必须能够在列表中删除和搜索特定人员的数据,我的问题是,它从文件中读取数据并存储它, 但是 show(在屏幕上)函数卡在一个循环中,向我显示它从文件中读取的最后一个人信息的数据(在指向 NULL 之前会在最后一个节点上发生什么),保存(到文件)函数和搜索(列表)和删除(从列表中)函数也是如此,这让我认为它不知何故没有指向列表末尾的 NULL, 我检查了几次每个函数及其调用,找不到任何问题,但我几乎不是学生,我真的需要帮助,提前感谢(如果我没有正确格式化代码,我很抱歉)。
这是我使用所需函数制作的库:
#define EOL 'n'
struct fecha{
int dia,mes,año;
};
struct lista{
long cedula;
int genero;
char nombre[20];
char apellido[20];
char direccion[50];
fecha f;
lista *prox;
};
void asignar (int i,char lectura[50],lista **t){
switch (i)
{
case 1:
(*t)->cedula=atol(lectura);//atol convierte string a long
break;
case 2:
(*t)->genero=atoi(lectura);//atoi convierte string a int
break;
case 3:
strcpy((*t)->nombre,lectura);
break;
case 4:
strcpy((*t)->apellido,lectura);
break;
case 5:
strcpy((*t)->direccion,lectura);
break;
case 6:
(*t)->f.dia=atoi(lectura);
break;
case 7:
(*t)->f.mes=atoi(lectura);
break;
case 8:
(*t)->f.año=atoi(lectura);
break;
};
}
void insertaCab(lista **p, char path[100]){
lista *t = new lista;//crea el nodo
FILE *archivo;//apuntador para el archivo
int i=1;
char lectura[50];
archivo = fopen(path, "r");
if (archivo != NULL){//Si el archivo existe
while (!feof(archivo)){//Mientras no es final de archivo
while (i<=8){//lee 8 lineas y pasa al siguiente nodo de la lista
memset(lectura, 0, 50);
fgets(lectura,50,archivo);//Lee una linea
asignar(i,lectura,&t);>le pasa a asignar el contador,los datos y el apuntador de la lista
i++;
}i=1;
t->prox =(*p);//T->datos->||
(*p)=t;//P->datos->||
}fclose(archivo);
}
}
void muestra(lista *p){
lista *t = p;
while (t){
printf("Cedula: %in",t->cedula);
if (t->genero == 1) printf("Genero: Femeninon");
else printf("Genero: Masculinon");
printf("Nombre: %sn",t->nombre);
printf("Apellido: %sn",t->apellido);
printf("Direccion: %sn",t->direccion);
printf("Fecha de nacimiento: %i/%i/%inn",t->f.dia,t->f.mes,t->f.año);
t=t->prox;
}
printf("n");
}
int buscarlista(lista *p,long x){
lista *t=p;
while (t!= NULL ){
if (t->cedula == x)
return 1;
t=t->prox;
}
return 0;
}
void eliminar(lista **p, long x){
lista *t=(*p),*aux;
if (t!= NULL)
if (t->cedula == x){
(*p)=t->prox;
delete t;
}
else{
while ((t->prox!= NULL) && (t->prox->cedula!=x))
t=t->prox;
if (t->prox!= NULL){
aux=t->prox;
t->prox=aux->prox;
delete aux;
}
}
}
void guardar(lista *p,char path[100]){
lista *t= new lista;
t=p;//apuntador auxiliar para recorrer la lista
FILE *archivo;//apuntador para el archivo
archivo = fopen(path,"a");//abre el archivo en modo append, si no existe lo crea
if(archivo !=NULL){//Si el archivo existe
while (t){
fprintf(archivo,"Cedula: %in",t->cedula);
if (t->genero == 1) fprintf(archivo,"Genero: Femeninon");
else fprintf(archivo,"Genero: Masculinon");
fprintf(archivo,"Nombre: %sn",t->nombre);
fprintf(archivo,"Apellido: %sn",t->apellido);
fprintf(archivo,"Direccion: %sn",t->direccion);
fprintf(archivo,"Fecha de nacimiento: %i/%i/%inn",t->f.dia,t->f.mes,t->f.año);
t=t->prox;
}
fclose(archivo);
}
}
这是我的主要:
void main ( )
{
lista *p=NULL;
long x = 0;
int op;
char path[100];
op=-1;
while (op!=0){
printf ("1. Agregarn");
printf ("2. Buscarn");
printf ("3. Eliminarn");
printf ("4. Mostrarn");
printf ("5. Guardarn");
printf ("0. Salirn");
scanf ("%d", &op);
switch (op){
case 1: printf("Introduzca la direccion del archivo:");
memset(path,0,100);//Inicializa dir
scanf("%s",path);//Lee la direccion del archivo
insertaCab(&p,path);//Recibe el apuntador de la lista y la direccion del archivo
break;
case 2: printf("Indique el numero de cedula a buscar:");
scanf("%d",&x);
if (buscarlista(p,x) == 1)printf("El numero %i se encuentra en la listan",x);
else printf("No se encuentra en la listan");
break;
case 3: printf("Indique numero de cedula a eliminar:");
scanf("%d",&x);
eliminar(&p,x);
break;
case 4: muestra(p);
break;
case 5: printf("Introduzca la direccion en donde desea guardar la lista:");
memset(path,0,100);
scanf("%s",path);
guardar(p,path);
break;
};
}
}
您没有正确检测到EOF
。试试这个:
void insertaCab(lista **p, char path[100]){
char lectura[50];
FILE *archivo; = fopen(path, "r");
if (archivo == NULL) return;
lista *t = new lista;
while (fgets(lectura, 50, archivo)) {
for (i = 1; i <= 8 && fgets(lectura, 50, archivo); i++)
asignar(i, lectura, &t);
if (i <= 8) break; // reached EOF before 8 lines were read.
t->prox = *p;
*p = t;
}
fclose(archivo);
}
好吧,所以我能够解决它,我缺少malloc
函数的使用,这就是为什么列表从未达到 NULL 的原因。以下是从文件将数据输入到列表中的函数的固定和工作版本:
void insertaCab(lista **p, char path[100]){
lista *t = new lista;
t = (struct lista *) malloc( sizeof(struct lista) );
char lectura[50];
int i=1;
FILE *archivo = fopen(path, "r");
if (archivo == NULL) return;
while (fgets(lectura,50,archivo)){
t = (struct lista *) malloc( sizeof(struct lista) );
for (i=1; (i<=8) && (fgets(lectura,50,archivo)); i++)
asignar(i,lectura,&t);
if(i<=8) break;
t->prox =(*p);
(*p)=t;
}
fclose(archivo);
}