Ejercicio obligatorio 4

Fecha de entrega: Lunes 6 de noviembre

Introducción

Se tiene un formato de archivo binario que representa curvas de Bézier con la siguiente estructura:

C1

C2

...

CN

Donde cada curva a su vez tiene la siguiente estructura:

Nombre

n

x0

y0

x1

y1

...

xn-1

yn-1

Donde el nombre es una cadena que contiene primero un unsigned char que representa la longitud de la misma, y luego la cantidad de caracteres de su longitud, sin el '0'.

n es un uint32_t que representa la cantidad de puntos en la curva y, finalmente, se encuentra cada uno de esos puntos x, y cada uno representado como un float.

Trabajo

Lectura

Implementar una función bool leer_nombre(FILE *f, char **s); que reciba un archivo f abierto en modo lectura y devuelva en s un nombre almacenado como se dijo previamente. Por el nombre debe devolver true de haber funcionado correctamente.

Implementar una función bool leer_numero_puntos(FILE *f, uint32_t *n); que reciba un archivo f y lea de él la cantidad de puntos. Debe devolver true en caso correcto.

Implementar una función bool leer_punto(FILE *f, float *x, float *y); similar a las anteriores pero que lea un punto de la curva.

Escritura

Implementar una función bool escribir_nombre(FILE *f, const char *s); que reciba un archivo f abierto en modo escritura y escriba en él el nombre s. Por el nombre debe devolver true de haber funcionado correctamente.

Implementar una función bool escribir_numero_puntos(FILE *f, uint32_t n); que escriba el número de puntos.

Implementar una función bool escribir_punto(FILE *f, float x, float y); que escriba un punto.

Aplicación

Escribir un programa que se ejecute como:

$ ./20232_ej4 entrada salida

que lea un archivo de entrada con el formato dado y en simultaneo vuelque su contenido por stdout y además lo escriba en salida con el mismo formato binario, haciendo uso de las funciones ya desarrolladas. Luego de ejecutado el programa, el archivo de salida deberá ser una copia exacta al de entrada.

Pruebas

Se provee un archivo 20232_ej4.bin el cual al pasar por la aplicación (además de la copia) debe generar por stdout la siguiente salida:

$ ./20232_ej4 20232_ej4.bin salida.bin
CURVA 1
    Nombre: Curva 1
    Puntos: 13
            Punto 0: 7.1815, 21.1680
            Punto 1: 37.2663, 62.4798
            Punto 2: 29.1042, 119.8198
            Punto 3: 20.7887, 89.9597
            Punto 4: 13.2206, 60.0610
            Punto 5: 19.7725, 24.0883
            Punto 6: 20.2217, 21.1680
            Punto 7: 19.3440, 22.0458
            Punto 8: 11.1062, 35.0083
            Punto 9: 23.0565, 40.4448
            Punto 10: 33.7424, 47.6839
            Punto 11: 33.6838, 24.5675
            Punto 12: 32.8839, 21.1680
CURVA 2
    Nombre: Curva 2 sdsdf
    Puntos: 22
            Punto 0: 32.8839, 21.1680
            Punto 1: 39.6875, 34.7752
            Punto 2: 39.8765, 41.0118
            Punto 3: 40.6324, 32.6963
            Punto 4: 37.2389, 22.6123
            Punto 5: 53.0936, 14.3520
            Punto 6: 54.9955, 24.9478
            Punto 7: 56.1295, 32.8853
            Punto 8: 65.3899, 38.7439
            Punto 9: 54.0506, 41.7677
            Punto 10: 42.7113, 44.7915
            Punto 11: 38.9315, 42.3347
            Punto 12: 42.3333, 36.2871
            Punto 13: 45.7351, 30.2395
            Punto 14: 48.9312, 26.3146
            Punto 15: 55.5625, 32.8853
            Punto 16: 59.7736, 37.0580
            Punto 17: 61.1327, 35.8230
            Punto 18: 62.1921, 35.0695
            Punto 19: 63.1400, 34.3953
            Punto 20: 64.2836, 19.2192
            Punto 21: 65.9568, 20.2231
CURVA 3
    Nombre: Curva 3 asjdioasd
    Puntos: 13
            Punto 0: 65.9568, 20.2231
            Punto 1: 87.3125, 21.9240
            Punto 2: 90.7143, 136.8288
            Punto 3: 78.2411, 97.5192
            Punto 4: 65.7679, 58.2097
            Punto 5: 69.5476, 39.6889
            Punto 6: 74.4613, 29.8615
            Punto 7: 79.3750, 20.0341
            Punto 8: 83.9107, 15.4984
            Punto 9: 87.3125, 21.9240
            Punto 10: 90.7143, 28.3496
            Punto 11: 91.4702, 28.7276
            Punto 12: 91.4702, 28.7276
CURVA 4
    Nombre: Curva 4
    Puntos: 22
            Punto 0: 91.4702, 28.7276
            Punto 1: 99.4077, 45.3585
            Punto 2: 109.9911, 45.7365
            Punto 3: 112.2589, 46.1145
            Punto 4: 114.5268, 46.4924
            Punto 5: 104.3214, 45.7365
            Punto 6: 102.8095, 42.3347
            Punto 7: 101.2976, 38.9329
            Punto 8: 92.2262, 35.5311
            Punto 9: 97.1399, 30.9954
            Punto 10: 102.0536, 26.4597
            Punto 11: 108.4792, 20.4121
            Punto 12: 112.6369, 25.3258
            Punto 13: 116.7946, 30.2395
            Punto 14: 112.6369, 53.6740
            Punto 15: 114.9047, 45.3585
            Punto 16: 117.1726, 37.0430
            Punto 17: 111.1250, 33.2633
            Punto 18: 117.5506, 28.3496
            Punto 19: 123.9762, 23.4359
            Punto 20: 126.6220, 27.5936
            Punto 21: 126.6220, 27.5936
$

El archivo puede descargarse de acá 20232_ej4.bin

Nota

Para este trabajo no es necesario modularizar el problema, pero se recomienda hacerlo para practicar modularización y Makefile.

En el caso de modularizar en archivos entregar tanto los archivos como el Makefile que compila el proyecto.

Entrega

Deberá entregarse el código fuente del programa desarrollado o los fuentes y el Makefile en caso de haber modularizado.

El programa debe:

  1. Compilar correctamente con los flags:

    -Wall -Werror -std=c99 -pedantic
    
  2. validar la salida que se provee y que genere una copia de la entrda en la salida.

La entrega se realiza a través del sistema de entregas.

El ejercicio es de entrega individual.