Tarea 4 de Almacenamiento y Recuperación de la Información

Trimestre 2010 Primavera
Entrega: 15 de junio de 2010 a las 22:00

El propósito de esta tarea es el de practicar la lectura de archivos con registros de longitud fija y la escritura de archivos con registros de longitud variable.

El archivo de entrada fija.txt contendrá una serie de registros de longitud fija. Cada registro constará de tres campos de longitud fija. El primer campo ocupará cuatro posiciones y será un número de uno a cuatro dígitos escrito en decimal en el rango de 1 a 9999 (el campo de año de una fecha). El segundo campo ocupará dos posiciones y será un número de uno o dos dígitos escrito en decimal en el rango 1 a 12 (el campo de mes en una fecha). El tercer campo ocupará dos posiciones y será un número de uno o dos dígitos escrito en decimal en el rango 1 a 31 (el campo de día en una fecha). Las posiciones no ocupadas por dígitos estarán ocupadas por puntos y todos los dígitos de cada campo serán consecutivos, pero no necesariamente están alineados a la derecha o a la izquierda. Aunque cada campo tiene un rango bien definido es posible que aparezcan registros con contenidos inválidos (por ejemplo, caracteres que no son puntos o dígitos o números decimales que no correspondan a años, meses o días válidos).

El archivo de salida variable.txt deberá contener una serie de registros de longitud variable separados por avances de línea. Cada registro deberá constar de tres campos de longitud variable separados por un guión. El primer campo deberá ser un número de uno a cuatro dígitos escrito en decimal en el rango de 0 a 9999. El segundo campo deberá ser un número de uno a dos dígitos escrito en decimal en el rango de 0 a 12. El tercer campo deberá ser un número de uno a dos dígitos escrito en decimal en el rango de 0 a 31. Excepto por el valor 0 ningún campo de la salida podrá comenzar con el valor 0.

La idea general es transformar cada uno de los registros del archivo de entrada en un registro del archivo de salida. Así, por ejemplo, si el registro de la entrada es 2009.216 entonces el registro de salida debe ser 2009|2|16 o si el registro de la entrada es .15.021. entonces el registro de salida debe ser 15|2|1. Por otro lado, si el registro de la entrada es ilegal (ya sea porque no cumple con el formato descrito arriba o porque la fecha no tiene sentido) entonces el registro de salida deberá ser 0|0|0. Ejemplos de registros de entrada ilegales son 1.1.1..1, HOLA0215, 20091502 y 2009.230. Para facilitar las cosas, enero siempre tendrá 31 días, febrero siempre tendrá 28 días, etc.

Escribe un programa llamado fechasNN que lleve a cabo la transformación descrita arriba, donde NN es la clave de dos dígitos asignada por el profesor (si sólo recibiste un dígito X tu clave es 0X). Sólo deberás enviar el código fuente de tu programa (en C, C++, Java, Pascal, Fortran, etc. siempre y cuando compilen con gcc, g++, javac, fpc, f77, etc. tal cual esté instalado en el servidor).

Ejemplo de entrada (observa que nada separa un registro del siguiente)
1.1.1..12009.2162009.23020091502.15.021.HOLA0215
Ejemplo de salida (observa que los registros terminan con avance de línea)
0|0|0
2009|2|16
0|0|0
0|0|0
15|2|1
0|0|0