Universidad de Costa Rica
Escuela de Ciencias de la Computación e Informática
CI-1201 Programación II - 2012b
Profesor Jeisson Hidalgo-Céspedes
Implemente un comando sort que permita ordenar el contenido de archivos de texto o la entrada estándar. Su programa deberá comportarse como un comando normal de Unix. Si se invoca con el parámetro --help, brindará ayuda al usuario:
$ sort --help Usage: sort [-inrRW] [FILES] Writes sorted concatenation of all FILES to stardard output. Options: -i ignores case in comparisons -n considers each line as numbers instead of texts -r reverses the result of comparisons -R sorts randomly the FILES -t trims each line -W overwrites each original FILE instead of writing to standard output $
Su programa deberá hacer un análisis inicial de los parámetros provistos por el usuario, los cuales se pueden agrupar en cuatro tipos:
-i -n -r -R -t. Si ninguno se especifica se debe asumir que el usuario quiere ordenar alfabéticamente los archivos en forma ascendente considerando mayúsculas y minúsculas como distintas.-W que indica sobrescribir los archivos de entrada.--help para proveer ayuda.El análisis de parámetros incluye las siguientes consideraciones. Si se especifica --help, el programa debe imprimir ayuda en la salida estándar indiferentemente de cuáles otros parámetros se hayan provisto. Si se provee un parámetro no válido, se debe imprimir un mensaje en el error estándar. Si se provee el parámetro -W sin especificar ningún nombre de archivo, será reportado en el error estándar. En cualquiera de estos casos el programa termina su ejecución inmediatamente. Ejemplos:
$ sort -i -W -r -c sort: -c unknown option $ sort -i -W -r sort: -W option and no files were specified $
Si no se especifican nombres de archivos se asume que el texto será provisto en la entrada estándar y por ende, el resultado será impreso en la salida estándar. Por el contrario, si se proveen nombres de archivo y no la opción -W, el resultado de ordenar todas las líneas de todos los archivos indicados, será impreso en la salida estándar; pero si la opción -W fue especificada, el contenido de cada archivo particular será sobrescrito con su contenido ordenado. En cualquiera de estos casos, se dice que el comando tendrá una fuente de datos para trabajar, indiferentemente de si sean archivos o la entrada estándar; y también un destino de datos donde serán impresas las líneas ordenadas.
El programa debe trabajar a nivel de línea. Es decir, el comando lee líneas de la fuente de datos hasta encontrar el carácter fin de archivo. Cada línea obtenida será agregrada a un contenedor dinámico en memoria. Tras leer todas las líneas de la fuente de datos, se ordenan en el contenedor (si es necesario) y luego se imprime cada línea en el destino de datos. Nótese que cada archivo resultante tendrá la misma cantidad de líneas que el respectivo archivo original.
Si la opción -W es especificada, su programa debe abrir cada archivo indicado por parámetro y el resultado escribirlo en un archivo temporal. Puede utilizar el mismo nombre del archivo original concatenándole la extensión .tmp ó .sort. Para efectos de esta tarea asuma que este archivo temporal no existe, y si existiese, será truncado sin aviso. Una vez terminado el procesamiento, el archivo original es eliminado con la función remove(), y el archivo temporal es renombrado al original con la función rename(), ambas de la biblioteca <stdio.h>.
--help indiferentemente de los demás parámetros. Imprime error ante una opción no válida o ante un -W sin archivos.-W, el comando lee líneas de cada uno de ellos en orden e imprime resultados en la salida estándar.-W, lee líneas de cada uno de ellos en orden e imprime resultados en archivos temporales que luego reemplazan a los originales. Si hay algún error con el manejo de archivos (no existen, no hay espacio en disco, etc.) se reportan en el error estándar. Cierra archivos tan pronto como se dejen de utilizar.fgets() maneja adecuadamente cambios de línea al final de las cadenas devueltas. Si utiliza memoria dinámica no provoca fugas de memoria.trimLeft(), trimRight() y trimInside() trabajan correctamente, no acceden a memoria no permitida, hacen su trabajo en un único recorrido por la cadena. Retornan un puntero hacia el inicio de la cadena original. Pasan al menos todos los casos de prueba provistos por el profesor.Para presentar su solución, comprima los archivos fuente que utilizó y súbalos a la plataforma educativa en la asignación con nombre Tarea04.