Pues es que yo no he podido hacer una cosa, por si me pueden y quieren ayudar:
Me enseñaron a declarar un puntero, a darle el valor en memoria necesario, a recorrerlo como puntero (i+1 creo que era) y a recorrerlo como array (puntero[i]), me enseñaron como liberar la memoria ocupada, me enseñaron para que sirve un puntero, me enseñaron tambien a usarlo en una estructura...
Listo, ahora me piden mejorar la primera version de una agenda que ya habia hecho, pero que por desgracia no guarde la copia de su primera version, asi que me toco volver a escribir su codigo (sencillo, la verdad).. La agenda lee datos desde un archivo y los guarda al cerrar el programa (es su primera version, en las demas guarda cuando se requiere y lee cuando se requiere), listo, eso es sencillo, el problema es que la agenda segun me acuerdo, debe soportar hasta 1000 datos, por ahi facil, simplemente un struct-array con una longitud de 1000 y con los datos necesarios, pero me piden que solo use la memoria necesaria, es decir, usando punteros...
Lo intente hacer pero ando mas perdido
Lo hice asi, pero esta muy mal y no se como arreglarlo...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE* fichero;
int i;
int cont;
int num;
char cadena[51];
struct
{
char nombre[51];
char direccion[51];
unsigned long telefono;
char email[51];
short dia;
short mes;
short anio;
}agenda[1000];
struct agenda *datos;
struct agenda *dataTemp;
printf("Bienvenido a la version clasica de la agenda. Esta es la version 1.b\n"
"En esta version, vamos a hacer uso de punteros para no "
"desperdiciar memoria. Esperamos el buen manejo del "
"programa. Iniciemos \n");
printf("Lectura del inicio del programa: Intentando leer desde un archivo "
"agendav1.dat .....\n");
fichero = fopen("agendav1.dat","rb");
if (fichero==NULL)
printf("Imposible leer datos, fichero agendav1.dat no encontrado. Continuando\n");
else
{
printf("Fichero agendav1.dat encontrado. Comenzando a leer datos...\n");
fread(&cont,sizeof(int),1,fichero);
datos = (struct agenda*) malloc (cont * sizeof(agenda));
for(i=0;i<cont;i++)
{
fread(datos[i]->nombre,51,1,fichero);
fread(datos[i]->direccion,51,1,fichero);
fread(datos[i]->telefono,sizeof(telefono),1,fichero);
fread(datos[i]->email,51,1,fichero);
fread(datos[i]->dia,sizeof(short),1,fichero);
fread(datos[i]->mes,sizeof(short),1,fichero);
fread(datos[i]->anio,sizeof(short),1,fichero);
}
fclose(fichero);
}
do
{
printf("Elija una opcion del menu:\n");
printf("1. Añadir nuevos datos a la agenda\n");
printf("2. Visualizar todos los datos almacenados\n");
printf("3. Mostrar datos de una persona\n");
printf("4. Salir\n");
gets(cadena);
sscanf(cadena,"%d",&num);
switch(num)
{
case 1:
fichero = fopen("agendav1.dat","wb");
if(cont<1000)
{
printf("Introduzca el nombre: ");
gets(datos[cont]->nombre);
printf("\nIntroduzca la direccion: ");
gets(datos[cont]->direccion);
printf("\nIntroduzca el numero telefonico: ");
gets(cadena);
sscanf(cadena,"%ld",datos[cont]->movil);
printf("\nIntroduzca el correo electronico: ");
gets(datos[cont]->email);
printf("\nIntroduzca el dia de nacimiento: ");
gets(cadena);
sscanf(cadena,"%hd",datos[cont]->dia);
printf("\nIntroduzca el mes de nacimiento: ");
gets(cadena);
sscanf(cadena,"%hd",datos[cont]->mes);
printf("\nIntroduzca el año de nacimiento: ");
gets(cadena);
sscanf(cadena,"%hd",datos[cont]->anio);
cont++;
}
else
printf("Limite excedido. No hay espacio para mas nombres\n");
fclose(fichero);
break;
case 2:
for(i=0;i<cont;i++)
{
printf("%s %s %ld, %s, %hd/%hd/%hd\n",datos[i]->nombre,
datos[i]->direccion,datos[i]->movil,datos[i]->email,datos[i]->dia,
datos[i]->mes,datos[i]->anio);
}
break;
case 3:
printf("Introduzca el nombre de la persona a buscar: \n");
gets(cadena);
for(i=0;i<cont;i++)
{
if(strcmp(cadena,datos[i]->nombre)==0)
{
printf("%s %s %ld, %s, %hd/%hd/%hd\n",datos[i]->nombre,
datos[i]->direccion,datos[i]->movil,datos[i]->email,datos[i]->dia,
datos[i]->mes,datos[i]->anio);
}
}
break;
case 4:
printf("Guardando datos....\n\n");
fichero = fopen("agendav1.dat","wb");
fwrite(&cont,4,1,fichero);
for(i=0;i<cont;i++)
{
fwrite(datos[i]->nombre,sizeof(agenda[i].nombre),1,fichero);
fwrite(datos[i]->direccion,sizeof(agenda[i].direccion),1,fichero);
fwrite(datos[i]->telefono,sizeof(agenda[i].movil),1,fichero);
fwrite(datos[i]->email,sizeof(agenda[i].email),1,fichero);
fwrite(datos[i]->dia,sizeof(agenda[i].dia),1,fichero);
fwrite(datos[i]->mes,sizeof(agenda[i].mes),1,fichero);
fwrite(datos[i]->anio,sizeof(agenda[i].anio),1,fichero);
}
fclose(fichero);
printf("Fin de almacenamiento de datos....\nSaliendo....\n");
break;
default:
printf("Opcion no identificada...\n");
}
while(num!=4);
free(datos);
printf("Programa terminado...\n");
system("PAUSE");
return 0;
}
Ah por cierto, he intentado compilar en linux pero me da bastantes problemas con cadenas y todo eso xD, se me cierra el programa al realizar muchas funciones de otro proyecto que hice de aprendizaje, y lo mejoro cada vez que avanzo en el curso..
Eso no es de mucha importancia, pero bueno..
Si me pueden ayudar se los agradeceria...