Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MeCraniDOS en 20 Octubre 2013, 11:38 am



Título: [?] Archivos Binarios
Publicado por: MeCraniDOS en 20 Octubre 2013, 11:38 am
Buenas, tengo un problema con estos dos códigos  :rolleyes:

Son unas prácticas de la universidad, los enunciados son estos

2.3.- Escriu un programa que llegeixi els valors del radi de diferents esferes que hi ha en el  fitxer binari “10radi_esfera.dat” (les dades són enteres) i calculi el volum de les esferes corresponents. Els resultats s'han de guardar en un fitxer binari anomenat “10vol_esfera.dat” amb una precisió  de  tres  decimals.  A priori  desconeixem el  nombre  de  valors  que  hi  ha emmagatzemats al fitxer d'entrada.

2.4.-  Escriu un programa que llegeixi  el  volum de les esferes que hi  ha en el  fitxer binari “10vol_esfera.dat” i mostri el seu contingut per pantalla.



2.3

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define PI 3.141592654
  5.  
  6. int main()
  7. {
  8.  
  9. FILE *EsfRad, *EsfVol;
  10. int Radio;
  11. float Volumen;
  12.  
  13. EsfRad = fopen("10radi_esfera.dat","rb");
  14.  
  15. if(!EsfRad)
  16. {
  17. printf("Error: No se puede abrir el archivo");
  18. }
  19. else
  20. {
  21. EsfVol = fopen("10vol_esfera.dat","wb");
  22.  
  23. if(!EsfVol)
  24. {
  25. printf("Error: No se puede abrir el archivo");
  26. }
  27. else
  28. {
  29. while(!feof(EsfRad))
  30. {
  31. fread(&Radio, sizeof(Radio), 1, EsfRad);
  32. Volumen = (float)((4*PI*(pow(Radio,3)))/3);
  33. fwrite(&Volumen, sizeof(Volumen), 1, EsfVol);
  34. }
  35. }
  36.  
  37. fclose(EsfRad);
  38. fclose(EsfVol);
  39. }
  40.  
  41. return 0;
  42.  
  43. }

2.4

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define PI 3.141592654
  5.  
  6. int main()
  7. {
  8.  
  9. FILE *EsfRad;
  10. float Volumen;
  11.  
  12. EsfRad = fopen("10vol_esfera.dat","rb");
  13.  
  14. if(!EsfRad)
  15. {
  16. printf("Error: No se puede abrir el archivo");
  17. }
  18. else
  19. {
  20. while(!feof(EsfRad))
  21. {
  22.                        fread(&Volumen, sizeof(Volumen), 1, EsfRad);
  23. printf("Volumen = %.3f\n",Volumen);
  24. }
  25.  
  26. fclose(EsfRad);
  27. }
  28.  
  29. return 0;
  30.  
  31. }
  32.  

El problema que le veo no es de código (eso creo), sino que con los archivos que nos dan para hacer las pruebas, dos o tres volúmenes salen iguales..  :¬¬

No se si se puede, pero adjunto los archivos *.dat por si alguien lo puede/quiere revisar :rolleyes:

Saludos

Link (10radi_esfera.dat): http://www.mediafire.com/?jdangsbyw9ric1u (http://www.mediafire.com/?jdangsbyw9ric1u)


Título: Re: [?] Archivos Binarios
Publicado por: ivancea96 en 20 Octubre 2013, 14:01 pm
Me podrías dar el enunciado en Español? xD


Título: Re: [?] Archivos Binarios
Publicado por: MeCraniDOS en 20 Octubre 2013, 14:29 pm
Me podrías dar el enunciado en Español? xD

:¬¬ :¬¬

Hahaha en Español es así  :rolleyes:


Citar
2.3.- Escribe un programa que lea los valores del radio de diferentes esferas que hay en el archivo binario "10radi_esfera.dat" (los datos son enteros) y calcula el volumen de las esferas correspondientes. Los resultados se deben guardar en un archivo binario llamado "10vol_esfera.dat" con una precisión de tres decimales. A priori desconocemos el número de valores que hay almacenados en el archivo de entrada.

2.4.- Escribe un programa que lea el volumen de las esferas que hay en el archivo binario "10vol_esfera.dat" y muestre su contenido por pantalla.

Saludos  :silbar:


Título: Re: [?] Archivos Binarios
Publicado por: rir3760 en 20 Octubre 2013, 15:05 pm
En mi opinión los enunciados no explican de forma clara las operaciones a realizar. El primero indica "Los resultados se deben guardar ... con una precisión de tres decimales" y ello implica el uso de la función fprint sin embargo en el siguiente enunciado se refiere al archivo "10vol_esfera.dat" como uno binario cuando en realidad es texto.

Otro problema con los archivos binarios es que el numero y orden de sus bytes dependen de la implementación. En el caso de cuatro bytes por entero el valor 0x03000000 (o 0x00000003) aparece en dos ocasiones en el archivo y como utilizas la funcion feof para controlar el bucle (no deberias, utiliza directamente el valor de retorno de fread) el ultimo puede presentarse tambien como repetido.

Platica con tu profesor, en un caso ideal debe darles no solo el archivo de entrada sino también el de salida (para que verifiquen que el programa funciona correctamente)

Un saludo