Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: darklatios2006 en 21 Marzo 2013, 14:50 pm



Título: Ayuda con matriz dinámica de estructuras
Publicado por: darklatios2006 en 21 Marzo 2013, 14:50 pm
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!


Título: Re: Ayuda con matriz dinámica de estructuras
Publicado por: darklatios2006 en 21 Marzo 2013, 18:39 pm
Tengo que entregarlo mañana, nadie me puede echar una mano por favor?


Título: Re: Ayuda con matriz dinámica de estructuras
Publicado por: amchacon en 21 Marzo 2013, 18:51 pm
Código
  1. int revisarnotas(int fd)
  2. {
  3.  
  4.   ...
  5.  
  6.  
  7.  return (fd);
  8.  close(fd);
  9. }

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).


Título: Re: Ayuda con matriz dinámica de estructuras
Publicado por: darklatios2006 en 21 Marzo 2013, 19:29 pm
Código
  1. int revisarnotas(int fd)
  2. {
  3.  
  4.   ...
  5.  
  6.  
  7.  return (fd);
  8.  close(fd);
  9. }

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.


Título: Re: Ayuda con matriz dinámica de estructuras
Publicado por: amchacon en 21 Marzo 2013, 19:58 pm
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.