C/Visual C - Error Busqueda archivo binario

 
Vista:

Error Busqueda archivo binario

Publicado por Javier (1 intervención) el 07/02/2008 10:35:20
Hola amigo, tengo mañana examen, y la funcion BuscarActualizar() me tira error a la hora de comparar una cadena introducida con una almacenada en un archivo binario.

Os adjunto codigo, haber si me podeis hechar una mano, gracias nuevamente.

---------------------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct{
char nombre[30];
int edad;
}T_REGISTRO;

//Prototipos de funciones
void IntroducirDatos(T_REGISTRO vec[],int n);
void MostrarDatos(T_REGISTRO vec[],int n);
void EscribirFichero(T_REGISTRO vec[],int n);
void LeerFichero(T_REGISTRO vec[],int n, char imprimir);
void BuscarActualizar(int n);

int main(void){
T_REGISTRO *vec;
int n;
do{
printf("Introduce numero de elementos, n=");
scanf("%d", &n);
}while(n<=0 || n>100);
vec=(T_REGISTRO *)calloc(n,sizeof(T_REGISTRO));
if(vec==NULL){
printf("Error asignacion memoria dinamica");
exit(1);
}
IntroducirDatos(vec,n);
//MostrarDatos(vec,n);
EscribirFichero(vec,n);
LeerFichero(vec,n,'S');
BuscarActualizar(n);
}

void IntroducirDatos(T_REGISTRO vec[],int n){ //devuelve por referencia el vector personas
int i;
printf(" Introduce los datos ");
for(i=0;i<n;i++){
printf("PERSONA Nº%d", i+1);
fflush(stdin);
printf(" Nombre=");
gets(vec[i].nombre);
printf(" Edad=");
scanf("%d", &(vec[i].edad));
}
}

void MostrarDatos(T_REGISTRO vec[],int n){
int i;
printf(" ");
for(i=0;i<n;i++){
printf(" PERSONA%d",i+1);
printf(" Nombre:%s, Edad=%d", vec[i].nombre, vec[i].edad);
}

}

void EscribirFichero(T_REGISTRO vec[],int n){
FILE *fb;
fb=fopen("datos.dat", "wb");
if(fb==NULL){
printf("Error al abrir el archivo datos.dat");
exit(1);
}
//Guardo en mi fichero binario los datos introducidos
fwrite(vec, sizeof(T_REGISTRO), n, fb);//SIN &, pues vec es el vector completo que conoce su dir
/*TAMBIEN SE PODRIA, sin usar n
for(i=0;i<n;i++){
fwrite(&vec[i], sizeof(T_REGISTRO), 1, fb);
}
*/
if (fclose(fb)!=0){
printf("Error en el cierre");
exit(1);
}
}

/*
Esta funcion ademas de devolver por referencia el vector del tipo T_REGISTRO
te permite la posibilidad de imprimir por pantalla cuando imprimir=='s'
*/
void LeerFichero(T_REGISTRO vec[],int n, char imprimir){
int i;
FILE *fb;
fb=fopen("datos.dat", "wb");
if(fb==NULL){
printf("Error al abrir el archivo datos.dat");
exit(1);
}
for(i=0;i<n;i++){
fread(&vec[i], sizeof(T_REGISTRO), 1, fb);
}

if(imprimir=='S'){
printf(" DATOS LEIDOS de datos.dat");
for(i=0;i<n;i++){
printf(" PERSONA%d",i+1);
printf(" Nombre:%s, Edad=%d", vec[i].nombre, vec[i].edad);
}
}
if (fclose(fb)!=0){
printf("Error en el cierre");
exit(1);
}
}

/*
Funcion Busca dato de mi archivo binario
*/
void BuscarActualizar(int n){
int i;
int posicion;
char cadena[30];
T_REGISTRO *vec;
vec=(T_REGISTRO *)calloc(n,sizeof(T_REGISTRO));
if(vec==NULL){
printf("Error asignacion memoria dinamica");
exit(1);
}

FILE *fb;
fb=fopen("datos.dat", "wb");
if(fb==NULL){
printf("Error al abrir el archivo datos.dat");
exit(1);
}

printf(" Introduce NOMBRE a buscar: ");
fflush(stdin);
gets(cadena);

i=0;//Inicializo
//Recorro 1 a 1 hasta que lo haya encontrado, pero si no lo encuentro le dejo salir
//para que no se vuelva un bucle al infinito
//strcmp devuelve 0 cuando lo encuentra

do{
fread(vec[i].nombre, sizeof(T_REGISTRO),1,fb);
i++;
}while( (strcmp(vec[i].nombre , cadena)!=0)&&(i<n));


printf("i=%d",i);

//una vez encontrado devuelve el valor i+1
//por tanto mi solucion es 1 posicion menos
posicion=i-1;
if( strcmp(vec[posicion].nombre,cadena)==0 ){
char opc;
printf(" MENSAJE: %s encontrado", cadena);
printf(" Desea reescribrir su datos: [s ]: ");
opc = getchar();
opc = toupper(opc);
if(opc=='S'){
printf(" Introduce nuevo nombre: ");
gets(vec[posicion].nombre);
printf(" Introduce nueva edad: ");
scanf("%d", &(vec[posicion].edad));
//Salto al espacio "posicion" que es i-1
fseek(fb, posicion*sizeof(T_REGISTRO), SEEK_SET);
fwrite(&vec[posicion],sizeof(T_REGISTRO),1,fb);
printf(" FICHERO ACTUALIZADO");

}

}else{
printf("ERROR: %s NO ENCONTRADO", cadena);
}
if (fclose(fb)!=0){
printf("Error en el cierre");
exit(1);
}

//vuelvo a leer el archivo haber si ha habido fallos
LeerFichero(vec,n,'S');



}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder