13 de septiembre de 2018

Consideraciones adicionales con archivos de texto.

   Todos los ejemplos anteriores relacionados con archivos han recorrido de principio a fin el archivo que procesan pero, ¿qué sucede si se necesita volver a procesar nuevamente los datos del archivo?

   Dentro de la información indispensable que se encuentra representada en la estructura FILE para el control del archivo asociado se encuentra, como se mencionó con anterioridad, un indicador de posición, el cual hace referencia a la posición del último dato procesado en el archivo.

   Cuando un archivo ha sido procesado de principio a fin, el indicador de posición se encontrará ubicado al final del mismo, de tal forma que si por alguna razón se procesara de nuevo el archivo para lectura por ejemplo, se estaría en la situación de una lectura vacía, dando la impresión de que el archivo no contiene datos aún cuando sí los tenga, debido precisamente a que el indicador de posición del archivo se encuentra al final.

   Una posible solución a la problemática anterior sería cerrar el archivo, abrirlo nuevamente y procesarlo; sin embargo, el abrir y cerrar un archivo sólo para regresar el indicador de posición a su posición inicial es, además de ineficiente, un pésimo enfoque de solución: ¿qué sucede si el archivo tendrá un uso intensivo?, ¿es práctico estarlo abriendo y cerrando frecuentemente?

   La función rewind coloca el indicador de posición del archivo al inicio del archivo. Así, un llamado como "rewind(archivoPtr);" coloca el indicador de posición del archivo referido por archivoPtr al inicio de éste, de tal forma que se puedan procesar nuevamente el conjunto de datos almacenados en él, tal y como si el archivo se hubiera abierto por primera vez.

   Se deja como ejercicio para el lector que modifique el programa del Ejemplo 9.3 para que presente en la salida estándar dos veces, una seguida de otra, el archivo procesado. La idea de este ejercicio es que pueda practicar el uso de la función rewind descrita brevemente con anterioridad.

   Finalmente, debido a que la función fprintf es equivalente a la función printf, quizá se haya preguntado si es posible escribir en un archivo de texto otros tipos de datos además de cadenas, esto es, ¿es posible escribir en un archivo de texto otros tipos de datos como los siguientes:

fprintf(archivoPtr, "%d\n%s\n%s\n%.2f\n", num, nombre, direccion, salario);

donde num es de tipo int, nombre y direccion son cadenas, y salario es de tipo float?

   La respuesta es sí. Sin embargo, debe tomar en cuenta que cualquier tipo de dato, al ser almacenado en un archivo de texto, pierde su representación como tipo de dato y pasa a ser sólo una sucesión de caracteres dentro del archivo, de tal forma que al leer num o salario por ejemplo, se podrían leer como cadenas, y esto sería igual de válido que leerlos como un int o como un float. Por lo tanto, las sentencias:

            fscanf(archivoPtr, "%d %s %s %f", &num, nombre, direccion, &salario);
           fscanf(archivoPtr, "%f %s %s %f", &numero, nombre, direccion, &salario);
            fscanf(archivoPtr, "%s %s %s %s", cad1, nombre, direccion, cad2);

serían igualmente válidas, suponiendo que numero fuera de tipo float y que cad1 y cad2 fueran cadenas; aunque la más congruente sería la primera, en función de los datos que, según la idea planteada en esta entrada, se escribieron en el archivo referido por archivoPtr.

   Cuando trabaje con archivos de texto, no olvide tener en cuenta todas las consideraciones mencionadas en esta entrada.