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:
Compilar correctamente con los flags:
-Wall -Werror -std=c99 -pedantic
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.