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