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