Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Ficheros.

Estas en el tema de Ficheros. en el foro de C/C++ en Foros del Web. Hola buenas, trás mucho tiempo vuelvo al uso de ficheros en C(algo en lo que no soy precisamente un experto). Aquí les dejo mi código. ...
  #1 (permalink)  
Antiguo 15/11/2006, 13:56
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Ficheros.

Hola buenas, trás mucho tiempo vuelvo al uso de ficheros en C(algo en lo que no soy precisamente un experto). Aquí les dejo mi código.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define RUTA "/home/madrid/C/registro_alumnos.txt"

//Prototipos de las funciones.

int menu();
void anyadir_alumno();
//void modificar_alumno();
//void visualizar();

typedef struct
{
int dia;
int mes;
int anyo;
}fecha;

typedef struct
{
char nombre[20];
char apellidos1[20];
char apellidos2[20];
fecha fecha_nac;
char nota_evaluacion[4];
char nota_final[4];
}alum;


main()
{
int i,op;

while((op = menu()) != 4)
{
switch(op)
{
case 1:
anyadir_alumno();
break;
case 2:
//modificar_alumno();
break;
case 3:
//visualizar();
break;
case 4:
return 0;
default:
printf("\n Opcion incorrecta. Seleccione otra opcion.\n");
}
}
return 0;
}

int menu()
{
int op,ok;

printf("\n 1) Anyadir alumno.");
printf("\n 2) Modificar alumno.");
printf("\n 3) Visualizar alumnos.");
printf("\n 4) Salir.");

do{
printf("\n\n Seleccione opcion: ");
ok=scanf("%d",&op);
} while(!ok);
return op;
}

void anyadir_alumno()
{
alum * alumno;
FILE * fd;
static int i=0;

i++;
fd = fopen(RUTA,"a");
if(fd == NULL) return;

printf("\n\n\t Datos del alumno numero %d",i);
printf("\n\t Nombre: "); scanf("%s",&alumno[i].nombre);
printf("\n\t Apellido 1: "); scanf("%s",&alumno[i].apellidos1);
printf("\n\t Apellido 2: "); scanf("%s",&alumno[i].apellidos2);
printf("\n\t\t Fecha: ");
printf("\n\t\t Dia: "); scanf("%d",&alumno[i].fecha_nac.dia);
printf("\n %d has introducido",alumno[i].fecha_nac.dia);

fwrite(alumno[i].nombre,1,strlen(alumno[i].nombre),fd);
fwrite("-",1,1,fd);
fwrite(alumno[i].apellidos1,1,strlen(alumno[i].apellidos1),fd);
fwrite("-",1,1,fd);
fwrite(alumno[i].apellidos2,1,strlen(alumno[i].apellidos2),fd);
fwrite("-",1,1,fd);
fwrite(alumno[i].fecha_nac.dia,1,sizeof(alumno[i].fecha_nac.dia),fd);
fwrite("-",1,1,fd);
fclose(fd);
}

De momento estoy con la primera función, la de añadir un nuevo registro(por eso he hecho comentarios las llamadas a las demás funciones). Cuando intento guardar en el fichero la variable día, me da error en la línea que marqué en rojo, y no se porqué. Alguna sugerencia?Debería usar fprintf en vez de fwrite?
Gracias por su paciencia y ayuda.
Saludos.
  #2 (permalink)  
Antiguo 15/11/2006, 14:29
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cuando pongas codigo en el foro usa la etiqueta code entre [] para que salga asi (ahi esta el codigo correcto por cierto):

Código:
fwrite(&alumno[i].fecha_nac.dia, sizeof(alumno[i].fecha_nac.dia), 1, fd);
Código:
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
Como vemos en el prototipo de fwrite lo primero es un buffer, entonces le pasamos la direccion de memoria donde esta el valor de dia (si eso estuviera bien ...). Despues va el tamaño de cada elemento y despues el elemento. Por ultimo el stream. Si lo que querias era escribir el numero en decimal (ocupando sizeof(int)) eso es lo que tenes que hacer, si queres escribirlo como texto podes probar con fprintf.

Ojo que eso compila pero estas usando alum *alumno sin darle ningun valor a ese puntero ... y despues accedes como si fuera un array ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 15/11/2006 a las 14:37
  #3 (permalink)  
Antiguo 16/11/2006, 07:10
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Muchas gracias por tu respuesta Eternal Idol pero creo que no entendí bien lo último, que valor debo asignarle al puntero? No sé muy bien como hacer...
Por cierto cambié la línea por la que me propusiste y sigue sin funcionar...compila pero se cuelga.Dentro del fwrite, el 1 no debe ir en segundo lugar al igual que en las líneas
Código:
fwrite(alumno[i].apellidos1,1,strlen(alumno[i].apellidos1),fd);
fwrite(alumno[i].apellidos2,1,strlen(alumno[i].apellidos2),fd);
Saludos.

Última edición por yournightmare86; 16/11/2006 a las 07:18
  #4 (permalink)  
Antiguo 16/11/2006, 07:35
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por yournightmare86 Ver Mensaje
Muchas gracias por tu respuesta Eternal Idol pero creo que no entendí bien lo último, que valor debo asignarle al puntero? No sé muy bien como hacer...
No uses un puntero a menos que vayas a usar memoria dinamica (malloc/new).

Cita:
Iniciado por yournightmare86 Ver Mensaje
Por cierto cambié la línea por la que me propusiste y sigue sin funcionar...compila pero se cuelga.
Si, te lo habia advertido: "Ojo que eso compila pero estas usando alum *alumno sin darle ningun valor a ese puntero ... y despues accedes como si fuera un array ..."

Cita:
Iniciado por yournightmare86 Ver Mensaje
Dentro del fwrite
Esta explicado claramente arriba, mejor no puedo hacerlo y si es valido para cualquier llamada que hagas a esa funcion.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #5 (permalink)  
Antiguo 16/11/2006, 12:52
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Creo que empezaré de nuevo, que estoy hecho un lío. Probaré de otra manera. Muchas gracias.
  #6 (permalink)  
Antiguo 30/11/2006, 02:14
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Pues yo veo muy clara la explicacion.

la funcion fwrite, tienen su prototipo el cual te an mostrado. puedes verificarlo en stdio.h.

el problema en la funcion anyadir_alumno, es que estas declarando un puntero y posteriormente lo usas sin antes reservar memoria para este.

alum *alimnos = malloc(sizeof(alum)*10);//por ejemplo, y podrias redimencionar al requerir mas.

o si tienes un numero de registros determinado mejor usa un array:
alum alumnos[10];

agregar que en el while((op = menu()) != 4); y luego haces un case 4:
no crees que esta de sobra.
no tiene nada de malo pero puedes evitar una.

por como guardas tus datos en el fichero sería mejor usar fprintf y fscanf.
pero esto es segun tus requerimientos.
  #7 (permalink)  
Antiguo 30/11/2006, 15:07
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años
Puntos: 9
Gracias por la respuesta. Ya voy entendiendo mejor que hace poco me hicieron un cacao en la cabeza...
Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:08.