C/Visual C - fichero binario(agenda)

   
Vista:

fichero binario(agenda)

Publicado por lest (1 intervención) el 09/04/2009 15:43:13
Buenas,estoy trabajando con ficheros, y he creado una agenda,previamente con ficheros normales de tipo texto( y funciona bien)
Ahora estoy con binarios, y me surgen problemas: introduzco un usuario,lo busco,y lo encuentra, introduzco el segundo,lo busco y lo encuentra,pero si vuelvo a buscar el primero no lo encuentra.
Es mas, si cierro el programa y lo vuelvo a ejecutar,no encuentra ninguno.
Me he estado descerebrando y no soy capaz de dar con el error, a ver si sois capaces de echarme 1 mano, os dejo el codigo.Gracias!!!

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

struct funcion
{
char nombre[50];
int num;
};


int main()

{
FILE *f;
FILE *a;
char cad[50];
char nombre[50];
char apellido[50];
char telefono[50];
int contador=0;
int cont=1;
int i;
int pos=0;
int numelem=0;
int encontrado=0;
struct funcion x[50];
char opcion2='o';

int opcion=0;


while(opcion!=5)
{


switch (opcion)

{
case 0: system("mkdir c:\agenda");
break;


case 1: f=fopen("c:\agenda\agenda.dat","ab");
if((f==NULL))
{
printf("Upps!Error al abrir fichero :( ");
printf("Debe de crear el directorio ");
system("pause");
system("cls");
}
else
{
printf("Introduzca Nombre, Apellido y Telefono ");
scanf("%s %s %s",nombre,apellido,telefono);
fflush(stdin);
printf("-Esta seguro? s/n ");
scanf("%c",&opcion2);

if(opcion2=='s')
{
fwrite(&nombre,sizeof(char),1,f);
fwrite(&apellido,sizeof(char),1,f);
fwrite(&telefono,sizeof(char),1,f);
printf("Gracias! ;-) ");
}
else
{
printf("Volviendo al menu... ");
}
system("pause");
system("cls");
}
rewind(f);
fclose(f);
break;

case 2: fflush(stdin);
f=fopen("c:\agenda\agenda.dat","rb");
if((f==NULL))
{
printf("Upps!Error,fichero vacio :( ");

system("cls");
}
else
{

printf("Introduzca un nombre para buscar ");
gets(cad);


fread(&nombre,sizeof(char),1,f);
while(!feof(f))
{


if(strcmp(cad,nombre)==0)
{
fread(&apellido,sizeof(char),1,f);
fread(&telefono,sizeof(char),1,f);
printf("Encontrado :-) ");
printf("Usuario %d ",cont);
printf("El usuario es: ");
printf("Nombre:%s Apellido:%s Telefono:%s ",nombre,apellido,telefono);
contador=1;
cont++;
system("pause");
system("cls");

}

fread(&nombre,sizeof(char),1,f);



}


if(contador==0)
{
printf("Upps!No esta en este fichero ");
system("pause");
system("cls");
}

}
rewind(f);
fclose(f);
break;






case 3: fflush(stdin);
f=fopen("c:\agenda\agenda.dat","rb");
if((f==NULL))
{
printf("Upps!Error,Fichero vacio :( ");
system("pause");
system("cls");
}
else
{
printf("Introduzca apellido para buscar ");
gets(cad);

fread(&apellido,sizeof(char),1,f);

while(!feof(f))
{

if(!strcmp(cad,apellido))
{
fread(nombre,sizeof(char),1,f);
fread(telefono,sizeof(char),1,f);
printf("Encontrado :-) ");
printf("Usuario %d ",cont);
printf("Nombre: %s Apellido:%s Telefono:%s ",nombre,apellido,telefono);
contador=1;
cont++;
system("pause");
system("cls");
break;

}
else
{

fread(&apellido,sizeof(char),1,f);


}
}
if(contador==0)
{
printf("Upps!no esta en este fichero :( ");

system("pause");
system("cls");
}
}
rewind(f);
fclose(f);
break;






case 4:

f=fopen("c:\agenda\agenda.dat","rb");
if((f==NULL))
{
printf("Upps!Error,Fichero vacio :( ");
system("pause");
system("cls");
}
else
{
fread(&nombre,sizeof(char),1,f);

while(!feof(f))
{
encontrado=0;
for(i=0;i< numelem;i++)
{
if(!strcmp(x[i].nombre,nombre))
{
encontrado=1;
pos=i;
break;
}
}

if(encontrado==0)
{
strcpy(x[numelem].nombre,nombre);

x[numelem].num=1;
numelem++;
}

else

{
x[pos].num++;
}
fread(&nombre,sizeof(char),1,f);


}

for(i=0;i< numelem;i++)
{
printf("coincidencias:%d nombre:%s ",x[i].num,x[i].nombre);
}

}
system("pause");
system("cls");
rewind(f);
fclose(f);

break;


case 5: printf("Fin del programa :-)! ");

break;

case 6: printf("**AYUDA** ");
printf("-Al pulsar 0) Crea directorio de la agenda en c:agenda) ");
printf("-Al pulsar 1) por primera vez se creara la agenda, introduciendo sus contactos sucesivamente ");
printf("-Al pulsar 2) Busqueda por nombre(Diferencia mayusculas de minusculas) ");
printf("-Al pulsar 3) Busqueda por apellido(Diferencia mayusculas de minusculas) ");
printf("-Al pulsar 4) Contabiliza los nombres existentes y el numero de coincidencias) ");
printf("-Al pulsar 5) Salir del programa ");
printf("-Al pulsar 7) Realiza una copia de seguridad ");
system("pause");
system("cls");
break;


case 7:
fflush(stdin);
printf("Desea hacer copia de seguridad? s/n ");
scanf("%c",&opcion2);
if(opcion2=='s')
{
f=fopen("c:\agenda\agenda.dat","rb");
a=fopen("c:\agenda\agenda_copia.dat","wb");
if((f==NULL))
{
printf("Upps!Error,fichero vacio :( ");

system("cls");
}
else
{
fread(nombre,sizeof(char),1,f);

while(!feof(f))
{
fread(&nombre,sizeof(char),1,f);
fread(&apellido,sizeof(char),1,f);
fread(&telefono,sizeof(char),1,f);
fwrite(nombre,sizeof(char),1,a);
fwrite(&apellido,sizeof(char),1,a);
fwrite(&telefono,sizeof(char),1,a);

}
}
printf("Copiado con exito :) ");
rewind(f);
rewind(a);
fclose(f);
fclose(a);
system("pause");
system("cls");
}
else
{ printf("Volviendo al menu ");
system("pause");
system("cls");
}
break;

}

}

getch();
}
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

sizeof(nombre)

Publicado por jose (21 intervenciones) el 10/04/2009 04:17:28
//Buenas,estoy trabajando con ficheros, y he creado una agenda,previamente con ficheros normales de tipo texto( y funciona bien)
//Ahora estoy con binarios, y me surgen problemas: introduzco un usuario,lo busco,y lo encuentra, introduzco el segundo,lo busco y lo encuentra,pero si vuelvo a buscar el primero no lo encuentra.
//Es mas, si cierro el programa y lo vuelvo a ejecutar,no encuentra ninguno.
//Me he estado descerebrando y no soy capaz de dar con el error, a ver si sois capaces de echarme 1 mano, os dejo el codigo.Gracias!!!

// PROBAR...
// he modificado algunas cosas en opcion 1 y 2.
// fwrite( &nombre, 1, sizeof(nombre), f); // sizeof(nombre) = 50

// correcto : sizeof(nombre) = 50 // guardara el tamaño de la cadana nombre 50.
// incorrecto : sizeof(char) = 1 // guardara un solo caracter.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

struct funcion
{
char nombre[50];
int num;
};

int main()

{
FILE *f;
FILE *a;
char cad[50];
char nombre[50];
char apellido[50];
char telefono[50];
int contador=0;
int cont=1;
int i;
int pos=0;
int numelem=0;
int encontrado=0;
struct funcion x[50];
char opcion2='o';

int opcion = 2;


while(opcion!=5)
{


switch (opcion)

{
case 0: system("mkdir c:\agenda");
break;


case 1:
f=fopen("c:\agenda\agenda.dat","ab");
if((f==NULL))
{
printf("Upps!Error al abrir fichero :( ");
printf("Debe de crear el directorio ");
system("pause");
system("cls");
}
else
{

printf("Introduzca Nombre, Apellido y Telefono ");
scanf("%s %s %s",nombre,apellido,telefono);
printf( "***%s ", nombre );
printf( "***%s ", apellido );
printf( "***%s ", telefono );

fflush(stdin);
printf("-Esta seguro? s/n ");
scanf("%c",&opcion2);

if(opcion2=='s')
{
fwrite( &nombre, sizeof(nombre), 1, f);
fwrite( &apellido, sizeof(apellido),1 , f);
fwrite( &telefono, sizeof(telefono),1 , f);
printf("Gracias! ;-) ");
}
else
{
printf("Volviendo al menu... ");
}
system("pause");
system("cls");
}
//rewind(f);
fclose(f);
break;

case 2: fflush(stdin);
f=fopen("c:\agenda\agenda.dat","rb");
system("cls");

if((f==NULL))
{
printf("Upps!Error,fichero vacio :( ");
}
else
{

cont = 0;
printf("Introduzca un nombre para buscar ");
gets(cad);

while( !feof(f) )
{
cont++;
fread( nombre, 1, sizeof(nombre), f );
if( strcmp(cad,nombre)==0 )
{
fread(&apellido,sizeof(apellido),1,f);
fread(&telefono,sizeof(telefono),1,f);


printf("Encontrado :-) ");
printf("Usuario %d ",cont);
printf("El usuario es: ");
printf("Nombre:%s Apellido:%s Telefono:%s ",nombre,apellido,telefono);
//contador=1;

system("pause");
system("cls");
break;

}
else
{
if( feof(f) )
{
printf("Upps!No esta en este fichero ");
system("pause");
break;
}

fseek( f, sizeof(apellido)+sizeof(telefono), SEEK_CUR );
}
}

/*
if(contador==0)
{
system("pause");
}
//*/

}

//rewind(f);
fclose(f);
break;






case 3: fflush(stdin);
f=fopen("c:\agenda\agenda.dat","rb");
if((f==NULL))
{
printf("Upps!Error,Fichero vacio :( ");
system("pause");
system("cls");
}
else
{
printf("Introduzca apellido para buscar ");
gets(cad);

fread(&apellido,sizeof(char),1,f);

while(!feof(f))
{

if(!strcmp(cad,apellido))
{
fread(nombre,sizeof(char),1,f);
fread(telefono,sizeof(char),1,f);
printf("Encontrado :-) ");
printf("Usuario %d ",cont);
printf("Nombre: %s Apellido:%s Telefono:%s ",nombre,apellido,telefono);
contador=1;
cont++;
system("pause");
system("cls");
break;

}
else
{

fread(&apellido,sizeof(char),1,f);


}
}
if(contador==0)
{
printf("Upps!no esta en este fichero :( ");

system("pause");
system("cls");
}
}
rewind(f);
fclose(f);
break;






case 4:

f=fopen("c:\agenda\agenda.dat","rb");
if((f==NULL))
{
printf("Upps!Error,Fichero vacio :( ");
system("pause");
system("cls");
}
else
{
fread(&nombre,sizeof(char),1,f);

while(!feof(f))
{
encontrado=0;
for(i=0;i< numelem;i++)
{
if(!strcmp(x[i].nombre,nombre))
{
encontrado=1;
pos=i;
break;
}
}

if(encontrado==0)
{
strcpy(x[numelem].nombre,nombre);

x[numelem].num=1;
numelem++;
}

else

{
x[pos].num++;
}
fread(&nombre,sizeof(char),1,f);


}

for(i=0;i< numelem;i++)
{
printf("coincidencias:%d nombre:%s ",x[i].num,x[i].nombre);
}

}
system("pause");
system("cls");
rewind(f);
fclose(f);

break;


case 5: printf("Fin del programa :-)! ");

break;

case 6: printf("**AYUDA** ");
printf("-Al pulsar 0) Crea directorio de la agenda en c:agenda) ");
printf("-Al pulsar 1) por primera vez se creara la agenda, introduciendo sus contactos sucesivamente ");
printf("-Al pulsar 2) Busqueda por nombre(Diferencia mayusculas de minusculas) ");
printf("-Al pulsar 3) Busqueda por apellido(Diferencia mayusculas de minusculas) ");
printf("-Al pulsar 4) Contabiliza los nombres existentes y el numero de coincidencias) ");
printf("-Al pulsar 5) Salir del programa ");
printf("-Al pulsar 7) Realiza una copia de seguridad ");
system("pause");
system("cls");
break;


case 7:
fflush(stdin);
printf("Desea hacer copia de seguridad? s/n ");
scanf("%c",&opcion2);
if(opcion2=='s')
{
f=fopen("c:\agenda\agenda.dat","rb");
a=fopen("c:\agenda\agenda_copia.dat","wb");
if((f==NULL))
{
printf("Upps!Error,fichero vacio :( ");

system("cls");
}
else
{
fread(nombre,sizeof(char),1,f);

while(!feof(f))
{
fread(&nombre,sizeof(char),1,f);
fread(&apellido,sizeof(char),1,f);
fread(&telefono,sizeof(char),1,f);
fwrite(nombre,sizeof(char),1,a);
fwrite(&apellido,sizeof(char),1,a);
fwrite(&telefono,sizeof(char),1,a);

}
}
printf("Copiado con exito :) ");
rewind(f);
rewind(a);
fclose(f);
fclose(a);
system("pause");
system("cls");
}
else
{ printf("Volviendo al menu ");
system("pause");
system("cls");
}
break;

}

}

getch();
return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar