Ayuda con matriz dinámica de estructuras

Iniciado por darklatios2006, 21 Marzo 2013, 14:50 PM

0 Miembros y 1 Visitante están viendo este tema.

darklatios2006

Buenas, tengo que hacer un programa que abra un archivo binario donde están alojados una serie de datos sobre alumnos y modificar las notas que estén entre 4.5 y 5 para ponerles un 5.

El programa debe usar E/S clásica para leer y escribir todo el archivo en memoria de una vez y operar desde memoria.

Mi programa consta de un archivo de cabecera donde está la estructura, un archivo .c donde está el main y otro archivo .c donde está la funcion revisanotas, encargada de leer los datos del archivo binario, modificar las notas y devolver el descriptor de fichero a la funcion main para que muestre por pantalla el numero de notas modificadas.

Pues bien, mi programa no modifica ninguna nota, no se porqué, a ver si me podéis echar una mano...

Aquí os dejo el código:

practica2.c:

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "practica2.h"

int revisanotas(int fd);

int main()
{
int n=0, seg=0, microseg=0, tiempo=0, fileDescriptor=0;
struct timeval t1, t2, t;

fileDescriptor = open("datos.bin",O_BINARY, S_IREAD);

if (fileDescriptor == -1)
printf("No se ha podido abrir el archivo\n");

tiempo = gettimeofday(&t1,NULL);

if (tiempo == -1)
printf("No se ha podido leer el tiempo de inicio\n");

n = revisanotas(fileDescriptor);   

tiempo = gettimeofday(&t2,NULL);

if (tiempo == -1)
printf("No se ha podido leer el tiempo de fin\n");

t.tv_usec = t2.tv_usec - t1.tv_usec;

microseg = t.tv_usec;

printf("Notas modificadas: %d\n", n);
printf("Tiempo empleado: %d microsegundos\n", microseg);
}

------------------------------------------------------------------------------------

revisanotas.c:

#include <stdio.h>
#include <stdlib.h>
#include "practica2.h"

int revisanotas(int fd)
{
int nota = 0, i = 0, n = 0, mod = 0;

struct evaluacion *tnota;
struct evaluacion tsize;

n = sizeof(tsize);

tnota = (struct evaluacion *)malloc(n*sizeof(struct evaluacion));

read(fd, tnota, n);

for(i=0; i<n; i++)
{   
if ((tnota.notamedia >= 4.5) && (tnota.notamedia < 5))
{   
tnota.notamedia = 5;
write(fd, tnota, n);
mod++;
i=i+n;
}
}

free(tnota);   
fd = mod;
return (fd);
close(fd);
}

---------------------------------------------------------------------------------

practica2.h:

struct evaluacion
{
char id[16];    /*DNI o similar*/
char apellido1[32];
char apellido2[32];
char nombre[32];
float nota1p;    /*Nota 1er parcial*/
float nota2p;    /*Nota 2do parcial*/
float notamedia;    /*Nota media*/
char photofilename[20];    /*Nombre del JPEG*/
int photosize;    /*Tamaño del JPEG*/
char photodata[16000];    /*Datos del JPEG*/
};

int revisanotas(int fd);

-------------------------------------------------------------------------

Un saludo y muchas gracias!

darklatios2006

Tengo que entregarlo mañana, nadie me puede echar una mano por favor?

amchacon

int revisarnotas(int fd)
{

   ...


  return (fd);
  close(fd);
}


Devuelves el identificador fd? Tendrías que devolver mod (el numero de notas modificadas). Además el close debería ir antes del return (la función acaba en el return).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

darklatios2006

Cita de: amchacon en 21 Marzo 2013, 18:51 PM
int revisarnotas(int fd)
{

   ...


  return (fd);
  close(fd);
}


Devuelves el identificador fd? Tendrías que devolver mod (el numero de notas modificadas). Además el close debería ir antes del return (la función acaba en el return).

Si, es cierto, pero aun haciendo eso sigue devolviéndome 0.

El problema tiene que estar en el read, write o en el bucle de modificación de notas.

Gracias por tu ayuda.

amchacon

Lo más probable es que el archivo no esté correcto (por ejemplo, hayas omitido algun campo).

De hecho, no estoy seguro que se pueda leer las estructuras directamente.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar