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
En cada ejercicio se evaluará la eficiencia del código, el uso de identificadores significativos, la indentación, escritura correcta de llaves {} y el uso adecuado de la palabra reservada const. Se dispone de dos horas para entregar la prueba y debe realizarse en forma estrictamente individual.
Implemente en C o C++ un comando sar (search and replace) que ayude al usuario a encontrar o reemplazar segmentos de texto en 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:
$ sar --help Usage: sar [-ilW] search-text [-r replacement-text] [FILES] Prints each line of FILES where search-text is found. Each occurrence of search-text will be replaced by replacement-text if -r option is provided. Options: -i ignores case sensitivity -l prints filenames and line numbers -r replaces each occurrence of search-text by replace-text -W overwrites each original FILE, requires -r $
Su programa deberá hacer un análisis inicial de los parámetros provistos por el usuario, los cuales se pueden agrupar en seis tipos:
-i), y si se debe imprimir en los resultados los nombres de los archivos y números de línea (-l).-W que indica sobrescribir los archivos de entrada.--help para proveer ayuda.-r.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. El texto de búsqueda search-text es obligatorio, si no se especifica se indica en el error estándar. 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 o sin especificar la opción -r, será reportado en el error estándar. En cualquiera de estos casos el programa termina su ejecución inmediatamente. Ejemplos:
$ sar -l -W -i -f file1.txt sar: -f unknown option $ sar -l -W -i sar: no search-text provided $ sar -l -W -i "some text" sar: -W option requires -r replacement-text $ sar -l -W -i "some text" -r "another text" sar: -W option and no files were specified $
Si un texto de reemplazo es provisto con la opción -r, el texto buscado será reemplazado por este texto en cada resultado impreso en la salida estándar.
Si no se especifican nombres de archivos se asume que el texto donde se debe realizar la búsqueda 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, los resultados de la búsqueda serán impresos en la salida estándar; pero si la opción -W fue especificada, la opción -r será obligatoria, y el contenido de los archivos será sobrescrito con el resultado de reemplazar el texto de búsqueda con el texto de reemplazo.
En cualquiera de estos casos del párrafo anterior, 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 impresos los resultados. Sugerencia: note que las funciones fgets(), fputs() y fprintf() pueden trabajar tanto en archivos como la entrada y salida estándar, simplemente cambiando el parámetro FILE*.
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. En cada línea obtenida buscará el texto de búsqueda y si lo encuentra, imprimirá dicha línea en el destino de datos. Si la opción -r fue provista, la línea se imprimirá cambiando el texto de búsqueda por el texto de reemplazo. Las líneas donde no se encuentre el texto de búsqueda serán omitidas, a menos de que se especifique la opción -W.
Si la opción -W es especificada, su programa debe abrir cada archivo 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 ó .trim. Para efectos de este enunciado asuma que este archivo 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>. Recuérdese que ante la presencia de la opción -W, su programa debe imprimir en los archivos resultantes, tanto las líneas en que se reemplazó el texto de búsqueda como aquellas en que no.
--help indiferentemente de los demás parámetros. Imprime error ante una opción no válida, falta el texto de búsqueda, ante un -W sin archivos, o -W sin -r.-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.-l. Si utiliza fgets() maneja adecuadamente cambios de línea al final de las cadenas devueltas. Si utiliza memoria dinámica no provoca fugas de memoria.sar -liW file.txt equivale a sar -l -i -W file.txt.fgets() incrementando el tamaño del buffer hasta que encuentre el final de línea.