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

Problema con estructuras y ficheros.

Estas en el tema de Problema con estructuras y ficheros. en el foro de C/C++ en Foros del Web. Buenas, estaba programando un problema a priori sencillo, pero se me han planteado muchas dudas. El problema en cuestión pide que con un archivo binario ...
  #1 (permalink)  
Antiguo 02/12/2010, 06:52
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 meses
Puntos: 0
Problema con estructuras y ficheros.

Buenas, estaba programando un problema a priori sencillo, pero se me han planteado muchas dudas. El problema en cuestión pide que con un archivo binario "ejemplo.bin" lleno de estructuras, vaya leyendo uno por uno cada alumno, y si su nota es menor que 5, escriba el nombre y la nota (sólo esos dos campos) en el fichero "aprobados.bin" de lo contrario, en "suspendidos.bin".
Me da muchos errores a partir del if(clase.nota<5) . A ver si alguien me echa un cable.

Un saludo y gracias de antemano.
Código:
#include <stdio.h>
#include <stdlib.h>

struct alumno{
    char nombre[50];
    int grupo;
    float nota;
};
main(){
    struct alumno clase[50];
    FILE * fichero;
    FILE * aprobados;
    FILE * suspendidos;
    int cont=0,i,num;
    float x;
    fichero=fopen("ejemplo.bin","rb");
    if (fichero==NULL){
        printf("No se puede abrir el archivo");
        exit (-1);
    }
    aprobados=fopen("aprobados.bin","rb");
    suspendidos=fopen("suspendidos.bin","rb");
    while(fread(&x,sizeof(x),1,fichero)!=0){
            if(clase.nota<5){
                fwrite(&fichero,sizeof(char (clase.nombre[50])),1,suspendidos);
                fwrite(&fichero,sizeof(float (clase.nota)),1,suspendidos);
            }
            else{
                fwrite(&fichero,sizeof(char (clase.nombre[50])),1,aprobados);
                fwrite(&fichero,sizeof(float (clase.nota)),1,aprobados);
            }
                
                
    }
}
  #2 (permalink)  
Antiguo 02/12/2010, 08:12
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Problema con estructuras y ficheros.

Como entrada tienes un fichero de estructuras alumno, pero cuando lo lees estás leyendo directamente un float en x. Deberías leer una estructura alumno.

Cuando compruebas la nota, escribes (fwrite) el contenido apuntado por fichero, que es un puntero a la estructura FILE en la que has abierto el fichero de entrada. Las funciones fread/fwrite tienen, como primer parámetro, la dirección del buffer en que tienen que leer/escribir. Esto te ocurre en todos los fwrite del if y del else.

clase lo has declarado como array de estructuras. Tienes que indicar el índice correspondiente a la estrctura en uso. No puedes poner clase.nombre o clase.nota, tiene que ser clase[indice].nombre o clase[indice].nota (entiéndase por índice cualquier variable entera con la que estés indexando tu array de estrcturas).

El operador sizeof, si se aplica a un array dimensionado explícitamente, devuelve el total de bytes que necesita ese array, es decir, sizeof(alumno.nombre) te devolverá el valor 50.

Prueba con esto (supuestamente, x ya está declarada como struct alumno):

Código C++:
Ver original
  1. while(fread(&x,sizeof(x),1,fichero)!=0)
  2. {
  3.     if(clase[cont].nota<5)
  4.     {
  5.         fwrite(clase[cont].nombre, sizeof(clase[cont].nombre),1,suspendidos);
  6.         fwrite(&clase[cont].nota, sizeof(clase[cont].nota),1,suspendidos);
  7.     }
  8.     else
  9.     {
  10.         fwrite(clase[cont].nombre, sizeof(clase[cont].nombre),1,aprobados);
  11.         fwrite(&clase[cont].nota, sizeof(clase[cont].nota),1,aprobados);
  12.     }
  13.     cont++;
  14. }

(aunque no lo he probado, supongo que habrá quitado alguno de los errores que te daba).

Una última sugerencia: Conviene indicar el compilador y el sistema operativo con los que trabajas, también los errores que te haya reportado, servirá de guía a quien vaya a darte una posible respuesta.

Saludos,
  #3 (permalink)  
Antiguo 02/12/2010, 11:21
 
Fecha de Ingreso: diciembre-2010
Mensajes: 8
Antigüedad: 13 años, 4 meses
Puntos: 0
Respuesta: Problema con estructuras y ficheros.

Muchas gracias Fw190. Utilizo el wxDevC++ en Windows. La cuestión era que no entendía bien cómo funcionaba los fwrite, porque es lo último que he visto en la Universidad y junto con las estructuras, se me hace bastante abstracto.
Una última duda, porqué en el primer fwrite pones solo clase[cont] y en el segundo &clase[cont] ?

Gracias de nuevo y un saludo
  #4 (permalink)  
Antiguo 08/12/2010, 14:25
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 13 años, 10 meses
Puntos: 73
Respuesta: Problema con estructuras y ficheros.

En el primero, clase[cont].nombre es un array (en este caso de caracteres). En C, el nombre de un array es un puntero al primer elemento, por ello no es necesario anteponer el operador de dirección (&).

En el segundo, clase[cont].nota es un float, y por tanto hay que pasar su dirección para utilizarlo con fread/fwrite. De ahí que se le anteponga el operador de dirección (&).

Etiquetas: estructuras, ficheros
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 09:13.