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

Duda sobre instrucción fclose

Estas en el tema de Duda sobre instrucción fclose en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 15/10/2012, 18:38
Avatar de albertocar  
Fecha de Ingreso: agosto-2010
Mensajes: 17
Antigüedad: 13 años, 8 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);
}
  #2 (permalink)  
Antiguo 15/10/2012, 19:15
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Duda sobre instrucción fclose

Tiene razon tu profesora.... el problema es como estas abriendo el archivo al principio. vos lo estas abriendo como escritura y despues lo queres abris como lectura....

pero si pones:
fopen("c:clase.dat","r+b")

lo podes leer y escribir al mismo tiempo...

saludos
  #3 (permalink)  
Antiguo 16/10/2012, 04:45
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 11 meses
Puntos: 73
Respuesta: Duda sobre instrucción fclose

while(!feof(datos))

La marca de fin de fichero no existe en archivos binarios, como es este caso. Si necesitas controlar si has leído el último registro, tendrás que indicarlo tú mismo de algún modo, por ejemplo escribiendo un último registro (no válido, claro) con algún dato imposible, como, por ejemplo, una edad negativa en tu estructura de datos.

Saludos,
  #4 (permalink)  
Antiguo 16/10/2012, 06:57
Avatar de albertocar  
Fecha de Ingreso: agosto-2010
Mensajes: 17
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Duda sobre instrucción fclose

Bueno, gracias por las respuestas. Voy a probar como me decís a ver cómo va. Gracias otra vez.

Me re-edito.

Sam90, si abro el archivo como me dices ("r+b"), me da error al crear el archivo y no me deja seguir.

Fw190, lo del registro no válido ya lo hago, pero aun así, si no pongo el fclose en mitad del código luego no me muestra nada por pantalla.

Gracias

Última edición por albertocar; 16/10/2012 a las 07:08
  #5 (permalink)  
Antiguo 16/10/2012, 10:49
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Duda sobre instrucción fclose

Eso pasa porque r+b abre el archivo pero no lo cree. Asi que deberias usar w+b.
Deberias buscar informacion al respecto.
  #6 (permalink)  
Antiguo 17/10/2012, 17:42
Avatar de albertocar  
Fecha de Ingreso: agosto-2010
Mensajes: 17
Antigüedad: 13 años, 8 meses
Puntos: 1
Respuesta: Duda sobre instrucción fclose

Bueno, finalmente encontré la manera de hacerlo funcionar sin escribir el fclose en medio y volver a abrir el archivo para leerlo.
La cuestión es que, en la versión del Borland c++ que usamos para programar, "r+b" no funciona. Así que me puse a investigar y encontré "wb+", que para esta versión sí que va; así que todo arreglado. Gracias igual por la ayuda.

Etiquetas: fclose, funcion, int, programa
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 19:13.