URGENTE Inventario con listas ligadas, buscar un registro y decir si existe o no

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
lebas_1
Mensajes: 4
Registrado: 12/05/2019 7:27 pm

URGENTE Inventario con listas ligadas, buscar un registro y decir si existe o no

#1 Mensaje por lebas_1 » 15/05/2019 5:09 pm

Buenas noches tengo un problema con la funcion de buscar en mi problema o no sé si surja desde otro punto mi error.
La primera es a la hora de mostrar mi archivo se muestra con basura.
Y la segunda en mi funcion buscar, no funciona bien, porque le ingreso una matricula que no está y me dice que si está. Ayuda por favor, lo necesito.

Código: Seleccionar todo

int buscar(){ 
    char clav[10];
    int ban=0, posi;
    FILE *pf;
    
      	  
    pf=fopen("inventario2.txt", "a+");
    if(pf==NULL){
    	printf("Error al abrir el archivo\n");
    	return;
	}
	
	printf("\nIngrese la placa del automovil\n");
    scanf("%s",&clav);
    
	while(!feof(pf)){
		fread(&inventario, sizeof(inventario),1,pf);
		
		if(strstr(clav, inventario.placas)!=NULL){
			ban=1;
			posi=ftell(pf); //ftell devuelve la posicion actual del puntero
			printf("%s %s", inventario.placas, inventario.precio);
			
		}
		
	}
	if(ban==0){
		printf("El auto con las placas %s no existe\n",clav);
		posi=-1;
    }
	fclose(pf);
	
	return posi;
 
}

int buscarMC(){ 
    char mod[15], col[10];
    int ban=0, posi;
    FILE *rf;
    
    printf("Ingrese el modelo a buscar:\n");
    scanf("%s",&mod);
    printf("Ingrese el color a buscar:\n");
    scanf("%s",&col);  
		  
    rf=fopen("inventario2.txt", "a+");
    if(rf==NULL){
    	printf("Error al abrir el archivo\n");
    	return;
	}
	
    
	while(!feof(rf)){
		fread(&inventario, sizeof(inventario),1,rf);
		
		if((strstr(mod, inventario.nombre)!=NULL)&&(strstr(col, inventario.color)!=NULL)){
			ban=1;
			posi=ftell(rf); //ftell devuelve la posicion actual del puntero
			printf("%s %s", inventario.placas, inventario.precio);
		}
		
	}
	if(ban==0){
		printf("El auto no existe\n");
		posi=-1;
    }
	fclose(rf);
	
	return posi;
 
}


int buscarPrecio(){ 
    char pre[10];
    int ban=0, posi;
    FILE *qf;
    
      	  
    qf=fopen("inventario2.txt", "a+");
    if(qf==NULL){
    	printf("Error al abrir el archivo\n");
    	return;
	}
	
	printf("\nIngrese el precio a buscar:\n");
    scanf("%s",&pre);
    
	while(!feof(qf)){
		fread(&inventario, sizeof(inventario),1,qf);
		
		if(strstr(pre, inventario.precio)!=NULL){
			ban=1;
			posi=ftell(qf); //ftell devuelve la posicion actual del puntero
			printf("%s %s", inventario.placas, inventario.precio);
		}
		
	}
	if(ban==0){
		printf("No existe un auto con ese precio\n");
		posi=-1;
    }
	fclose(qf);
	
	return posi;
 
}
Última edición por mollok el 15/05/2019 11:06 pm, editado 1 vez en total.
Razón: Los códigos deben ir entre etiquetas 'code', botón </>

mollok
Mensajes: 437
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: URGENTE Inventario con listas ligadas, buscar un registro y decir si existe o no

#2 Mensaje por mollok » 15/05/2019 11:14 pm

Abre el archivo como sólo lectura, con r y no con a+. No tiene sentido si no vas a añadirle cosas.

La secuencia correcta de una lectura secuencial es:

Código: Seleccionar todo

fread(...)
while(!feof...) {
    // Trabajo
    fread(...)
}
No leas o grabes una estructura directamente a un archivo. C puede desordenar los campos.
Debes grabar campo a campo y recuperarla campo a campo en el mismo orden. Y no guardes punteros, guarda su contenido. Si son punteros de listas enlazadas tampoco se guardan, deberás asignarles nuevas direcciones a medida que vas reconstruyendo la lista.
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 8 invitados