Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - darklatios2006

#1
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!