
24/03/2010, 09:24
|
| | Fecha de Ingreso: octubre-2008
Mensajes: 118
Antigüedad: 16 años, 6 meses Puntos: 2 | |
ficheros binarios C hola a todos, estoy intentado hacer un programa que me permita crear una lista de personas y despues guardarla en un fichero binario y en la proxima ejecucion cargar esta lista desde el fichero binario. Hasta el momento he conseguido crear la lista y guardarla pero cuando intento cargarla no me lee el archivo, tmp me da error, las funciones que estoy utilizando son estas:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct personas {
char nombre[15];
int edad;
struct personas *siguiente;
};
// carga el fichero(Solo la primera persona)
void cargar(char *archivo, struct personas **ultima, struct personas **primera, int *nPersonas){
FILE *fichero;
char nom[15];
if (fichero=fopen(archivo,"rb") == NULL){
puts("Error al abrir el fichero");
} else {
struct personas *persona=NULL;
if ((persona=malloc(sizeof(struct personas)))==NULL){
puts("Error al asignar la memoria");
} else {
int cont;
// leeo los 14 primeros carcteres y los guardo en nom
cont=fread(nom,sizeof(char),14,fichero);
// intrudozco el caracter nulo al final de la cadena
nom[14]='\0';
puts(nom);
printf("%d",cont);
fread(persona->edad,sizeof(int),1,fichero);
persona->siguiente=NULL;
if (*primera==NULL){
*primera=persona;
*ultima=persona;
} else {
(**ultima).siguiente=persona;
*ultima=persona;
}
(*nPersonas)++;
}
fclose(fichero);
printf("Cargado completo, hay %d personas\n",(*nPersonas));
}
}
// guarda la lista de personas al fichero
void guardar(char *archivo, struct personas *primera){
FILE *fichero;
if ((fichero=fopen(archivo,"wb"))==NULL){
puts("Error en la escritura del archivo");
} else {
fflush(stdin);
struct personas *perActual=primera;
while (perActual!=NULL) {
fwrite(perActual->nombre,sizeof(char),14,fichero);
fwrite(&perActual->edad,sizeof(int),1,fichero);
perActual=perActual->siguiente;
}
fflush(fichero);
fclose(fichero);
puts("Guardado completo");
}
}
void insertar(struct personas **primera, struct personas **ultima, int *nPersonas){
struct personas *persona=NULL; //puntero que apuntara a la persona q estamos creando
char nom[15];
// asignamos el espacio de memoria necesario para la persona
if ((persona=malloc(sizeof(struct personas)))==NULL){
puts("Error al asignar la memoria");
} else {
int cont=0;
// pedimos los datos de la persona
puts("Dime el nombre de la persona: ");
gets(nom);
// completamos con espacios para llegar a los 14 caracteres
for (cont=strlen(nom);cont<14;cont++){
nom[cont]=' ';
}
// introducimos el caracter nulo al final de la cadena
nom[cont]='\0';
strcpy(persona->nombre,nom);
fflush(stdin);
puts("Dime la edad: ");
scanf("%d",&persona->edad);
fflush(stdin);
persona->siguiente=NULL;
// ponemos siguiente a null ya que la persona actual sera la ultima
if (*primera==NULL){
// si primera es null no tenemos personas y la primera y ultima seran la actual
*ultima=persona;
*primera=persona;
} else {
// si ya tenemos personas el puntero siguiente de la ultima persona apuntara
// a la actual y la ultima sera esta
(**ultima).siguiente=persona;
*ultima=persona;
}
(*nPersonas)++;
puts("Insercion correcta");
}
}
void mostrar(struct personas *primera){
if ((primera==NULL)){
puts("No hay personas insertadas");
} else {
struct personas *perActual=primera;
// asignamos la primera persona al puntero y mos tramos sus datos
do {
printf("Nombre: %s\nEdad: %d\n",perActual->nombre, perActual->edad);
// buscamos la siguiente persona y apuntamos a ella
perActual=perActual->siguiente;
} while(perActual!=NULL);
}
}
y el main
Código:
#include <stdio.h>
#include <stdlib.h>
struct personas {
char nombre[15];
int edad;
struct personas *siguiente;
};
/*
*
*/
void main() {
int opcion=10;
char *archivo = "archivo.dat";
struct personas *primera=NULL;
struct personas *ultima=NULL;
int nPersonas=0;
while (opcion!=0){
puts("1. Cargar archivo");
puts("2. Guardar archivo");
puts("3. Insertar");
puts("4. Mostrar");
puts("0. Salir");
puts("Haga su eleccion");
scanf("%d",&opcion);
fflush(stdin);
switch(opcion){
case 1:{
cargar(archivo, &ultima, &primera, &nPersonas);
break;
}
case 2: {
guardar(archivo, primera);
break;
}
case 3: {
insertar(&primera, &ultima, &nPersonas);
break;
}
case 4: {
mostrar(primera);
break;
}
case 0: {
puts("Hasta la proxima");
break;
}
default: {
puts("No es una opcion valida");
}
}
}
}
creo q la funcion fread la estoy escribiendo bien pero nose xk no me lee nada.
Saludos,
Dani.
Última edición por nosek159; 24/03/2010 a las 09:33 |