Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/10/2012, 18:38
Avatar de albertocar
albertocar
 
Fecha de Ingreso: agosto-2010
Mensajes: 17
Antigüedad: 13 años, 9 meses
Puntos: 1
Duda sobre instrucción fclose

Hola a todo el mundo.

Estudio una carrera de Análisis de Sistemas, y en la asignatura de programación estamos aprendiendo C++. Ahora estamos viendo trabajo y manejo de archivos y tengo una duda al respecto, a ver si alguien me puede ayudar (desgraciadamente tenemos una profesora que es pésima y no nos explica mucho). Aquí pongo el código de un ejemplo de clase. La idea es crear un archivo binario que almacene los datos y luego leerlo e imprimir por pantalla los datos cargados. La discusión con la profesora es porque ella dice que no es necesario cerrar el archivo para leerlo e imprimir el contenido y que todo ese código (el que marco en rojo) es innecesario y que está mal. Sin embargo, si no pongo eso el programa no me funciona bien. Alguien me podría aclarar si ésto es así? Cómo lo soluciono (en el caso que esté mal)?
Muchísimas gracias por la ayuda. Ahí va el código:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define cla 10

struct alum
{
int nlega;
char apellido[15];
char nombre[15];
int edad;
int altura;
};

void cargar(struct alum *);

void main()
{
struct alum alumno, mostrar[cla];
FILE *datos;
int i=0,j;

if ((datos=fopen("c:clase.dat","wb"))==NULL)
{
printf("Error al crear el archivo");
getch();
exit(0);
}

clrscr();

cargar(&alumno);

while(alumno.nlega!=0)
{
fwrite(&alumno,sizeof(struct alum),1,datos);
cargar(&alumno);
}

fclose(datos); //ésta es la parte conflictiva

if ((datos=fopen("c:clase.dat","rb"))==NULL)
{
printf("Error al abrir el archivo");
getch();
exit(0);
}


fseek(datos,0,0);

fread(&mostrar[i],sizeof(struct alum),1,datos);

while(!feof(datos))
{
i++;
fread(&mostrar[i],sizeof(struct alum),1,datos);
}

fclose(datos);
clrscr();
printf("Los datos de los alumnos ingresado son: \n\n");
printf("\nNumero de legajo Apellido Nombre Edad Altura");
printf("\n");
for(j=0;j<i;j++)
{
printf(" %d %s %s %d %d",mostrar[j].nlega,mostrar[j].apellido,mostrar[j].nombre,mostrar[j].edad,mostrar[j].altura );
printf("\n");
}
getch();
}

void cargar(struct alum *alumn)
{
clrscr();
printf("Ingrese el numero de legajo: ");
scanf("%d",&alumn->nlega); fflush(stdin);
printf("\nIngrese el apellido del alumno: ");
gets(alumn->apellido); fflush(stdin);
printf("\nIngrese el nombre del alumno: ");
gets(alumn->nombre); fflush(stdin);
printf("\nIngrese la edad del alumno: ");
scanf("%d",&alumn->edad); fflush(stdin);
printf("\nIngrese la altura del alumno en centimetros: ");
scanf("%d",&alumn->altura); fflush(stdin);
}