elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con matriz dinámica de estructuras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con matriz dinámica de estructuras  (Leído 3,158 veces)
darklatios2006

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Ayuda con matriz dinámica de estructuras
« 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!


En línea

darklatios2006

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda con matriz dinámica de estructuras
« Respuesta #1 en: 21 Marzo 2013, 18:39 pm »

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


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ayuda con matriz dinámica de estructuras
« Respuesta #2 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).
En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Ayuda con matriz dinámica de estructuras
« Respuesta #3 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.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Ayuda con matriz dinámica de estructuras
« Respuesta #4 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.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado]Problemilla al acceder a una matriz dinamica
Programación C/C++
yiti007 2 2,941 Último mensaje 8 Mayo 2010, 19:10 pm
por leogtz
ayuda con estructuras
Programación C/C++
chechopineda 8 5,092 Último mensaje 16 Agosto 2010, 04:19 am
por chechopineda
Ayuda con estructuras « 1 2 »
Programación C/C++
eltoffer 15 8,071 Último mensaje 5 Febrero 2011, 23:53 pm
por Garfield07
lista con matriz dinamica
Programación C/C++
L·Storm! 2 4,380 Último mensaje 3 Agosto 2011, 03:03 am
por L·Storm!
Expandir matriz dinámica?
Programación C/C++
Metal-byte 2 6,132 Último mensaje 22 Enero 2012, 23:06 pm
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines