Gracias a todos por vuestras respuestas, son de gran ayuda. Bueno, me surgió una nueva duda sobre fread y fwrite (la guerra que me está dando esta orden... ) asi que aprovecho este mismo tema para exponerla.
El programa a construir es el siguiente: Mejorar la agenda anterior (del apartado 6.4), para guardar y leer cada "ficha" (struct) de una vez, usando fwrite/fread y sizeof, como en el último ejemplo.
Y aqui teneis el código de la agenda de la que se habla:
Bueno, para facilitar las cosas, las partes donde hay que sustituir e introducir un fread y fwrite son las siguientes:
fread
fwrite
Muchas gracias por vuestra atención y un saludo.
El programa a construir es el siguiente: Mejorar la agenda anterior (del apartado 6.4), para guardar y leer cada "ficha" (struct) de una vez, usando fwrite/fread y sizeof, como en el último ejemplo.
Y aqui teneis el código de la agenda de la que se habla:
Código [Seleccionar]
#include <stdio.h>
#include <string.h>
int main(){
FILE* Agenda;
struct{
char Name[100],Adress[100],Email[100],Movil[13];
unsigned short int Day,Month,Year;
}Datos[100];
char Buffer[200],Buscar[200];
int X=0,Y,Menu,Algodon=0;
//LEER DATOS DEL FICHERO
Agenda=fopen("agenda.dat","rt");
while(!feof(Agenda)){
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Name,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Adress,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Movil,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Email,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Day);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Month);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Year);
Algodon=1;
X++;
}
fclose(Agenda);
if(Algodon==0){
printf("No hay datos que leer...\n\n");
}
else if(Algodon==1){
printf("Datos leidos...\n\n");
}
do{
printf("1 - Introducir nuevo dato\n2 - Ver todos los nombres de los datos\n3 - Buscar\n0 - Salir\nQue desea hacer?: ");
fgets(Buffer,sizeof(Buffer),stdin);
sscanf(Buffer,"%d",&Menu);
switch(Menu){
//INGRESAR NUEVO DATO
case 1:
printf("\n\nNUEVO DATO:\nIngrese el nombre: ");
fgets(Datos[X].Name,sizeof(Datos[X].Name),stdin);
Datos[X].Name[strlen(Datos[X].Name)-1]='\0';
printf("Ingrese la ciudad: ");
fgets(Datos[X].Adress,sizeof(Datos[X].Adress),stdin);
Datos[X].Adress[strlen(Datos[X].Adress)-1]='\0';
printf("Ingrese el numero de movil: ");
fgets(Datos[X].Movil,sizeof(Datos[X].Movil),stdin);
Datos[X].Movil[strlen(Datos[X].Movil)-1]='\0';
printf("Ingrese el email: ");
fgets(Datos[X].Email,sizeof(Datos[X].Email),stdin);
Datos[X].Email[strlen(Datos[X].Email)-1]='\0';
printf("Ingrese el dia de nacimiento: ");
fgets(Buffer,sizeof(Buffer),stdin);
sscanf(Buffer,"%d",&Datos[X].Day);
printf("Ingrese el mes de nacimiento: ");
fgets(Buffer,sizeof(Buffer),stdin);
sscanf(Buffer,"%d",&Datos[X].Month);
printf("Ingrese su year de nacimiento: ");
fgets(Buffer,sizeof(Buffer),stdin);
sscanf(Buffer,"%d",&Datos[X].Year);
X++;
break;
//MOSTRAR LOS NOMBRES DE TODOS LOS DATOS
case 2:
if(X==0){
printf("\n\nNo hay datos que mostrar\n\n");
break;
}
printf("\n\nEstos son los nombres de todos los datos:\n");
for(Y=0;Y<X;Y++){
printf("%d - %s\n",Y,Datos[Y].Name);
}
printf("\n");
break;
//BUSCAR DATO POR NOMBRE
case 3:
printf("\n\nIntroduzca el nombre del contacto que desea buscar: ");
fgets(Buscar,sizeof(Buscar),stdin);
Buscar[strlen(Buscar)-1]='\0';
Algodon=0;
for(Y=0;Y<X;Y++){
if(strcmp(Buscar,Datos[Y].Name)==0){
printf("\nSe ha encontrado este/os resultado/s:\n");
printf("Name: %s\nAdress: %s\nPhone: %s\nEmail: %s\nBorn in: %d-%d-%d\n\n",Datos[Y].Name,Datos[Y].Adress,Datos[Y].Movil,Datos[Y].Email,Datos[Y].Day,Datos[Y].Month,Datos[Y].Year);
Algodon=1;
}
}
if(Algodon==0){
printf("\nNo se han encontrado resultados...\n\n");
}
}
}while(Menu!=0);
//ESCRIBIR LOS DATOS EN EL FICHERO
Agenda=fopen("agenda.dat","wt");
for(Y=0;Y<X;Y++){
fprintf(Agenda,"%s\n",Datos[Y].Name);
fprintf(Agenda,"%s\n",Datos[Y].Adress);
fprintf(Agenda,"%s\n",Datos[Y].Movil);
fprintf(Agenda,"%s\n",Datos[Y].Email);
fprintf(Agenda,"%d\n",Datos[Y].Day);
fprintf(Agenda,"%d\n",Datos[Y].Month);
fprintf(Agenda,"%d\n",Datos[Y].Year);
}
fclose(Agenda);
printf("\nSaliendo...");
return 0;
}
Bueno, para facilitar las cosas, las partes donde hay que sustituir e introducir un fread y fwrite son las siguientes:
fread
Código [Seleccionar]
Agenda=fopen("agenda.dat","rt");
while(!feof(Agenda)){
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Name,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Adress,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Movil,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
if(strlen(Buffer)>0) Buffer[strlen(Buffer)-1]='\0';
strcpy(Datos[X].Email,Buffer);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Day);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Month);
fgets(Buffer,200,Agenda);
if(feof(Agenda)) break;
sscanf(Buffer,"%d",&Datos[X].Year);
Algodon=1;
X++;
}
fclose(Agenda);
fwrite
Código [Seleccionar]
Agenda=fopen("agenda.dat","wt");
for(Y=0;Y<X;Y++){
fprintf(Agenda,"%s\n",Datos[Y].Name);
fprintf(Agenda,"%s\n",Datos[Y].Adress);
fprintf(Agenda,"%s\n",Datos[Y].Movil);
fprintf(Agenda,"%s\n",Datos[Y].Email);
fprintf(Agenda,"%d\n",Datos[Y].Day);
fprintf(Agenda,"%d\n",Datos[Y].Month);
fprintf(Agenda,"%d\n",Datos[Y].Year);
}
fclose(Agenda);
Muchas gracias por vuestra atención y un saludo.