Dra. Jessica Andrea Carballido jac@cs.uns.edu.ar Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Archivos de tipo TEXT Archivos de caracteres con fin de línea. El manejo es análogo al de la consola. Conversión automática a otros tipos. Archivos de tipo TEXT Archivos de tipo TEXT … var f: text; ent1, ent2: integer; Begin assign(f, ‘dosEnt.txt‘); reset(f); while not eof(f) do begin readln(f, ent1, ent2); … end; close(f); … … var f: text; ent: integer; r1, r2: real; Begin assign(f, ‘dosEnt.txt‘); reset(f); while not eof(f) do begin readln(f, r1, r2, ent); … end; close(f); … Archivos de tipo TEXT Procesamiento de Secuencias Archivos de caracteres con fin de línea. El manejo es análogo al de la consola. Conversión automática a otros tipos. Podemos manejar archivos de tipo TEXT como lo hacíamos con los “file of …” reset(f); while not eof(f) do begin read(f, elem); … end; close(f); A partir de un archivo conteniendo las temperaturas diarias de un período, generar otro archivo con la mínima, la máxima y el promedio de temperaturas. Por ejemplo, si el contenidos del archivo es: 7 11 8 10 11 11 15 8 5 El archivo generado será Minima 5 Maxima 15 Promedio 9,56 10 Procesamiento de Secuencias Procesamiento de Secuencias Problema: Leer un archivo conteniendo pares de números enteros representando las temperaturas mínimas y máximas diarias de un período y generar otro archivo con la diferencia diaria entre la máxima y la mínima. Puede asumir que el archivo tiene la estructura especificada, esto es un par de valores enteros por línea. f se maneja igual a un file of integer 2 15 3 17 0 13 1 11 Procesamiento de Secuencias Procesamiento de Secuencias Puede asumir que el archivo tiene la estructura especificada, esto es un par de valores enteros por línea. reset(paresTemp); rewrite(difTemp); while not eof(paresTemp) do begin readln(paresTemp, temp1, temp2); dif := temp2 - temp1; writeln (difTemp, dif); Este es el tipo de end; procesamiento close(paresTemp); close(difTemp); que vamos a realizar Procesamiento de Secuencias program paresTMtext; var temp1, temp2, dif: integer; paresTemp, difTemp: text; begin assign (paresTemp,'c:\archivos\paresTemp.txt'); assign (difTemp,'c:\archivos\difTemp.txt'); reset(paresTemp); rewrite (difTemp); while not eof(paresTemp) do begin readln (paresTemp, temp1, temp2); dif := temp2 - temp1; writeln (difTemp, dif:8:2); end; close (paresTemp); close (difTemp); end. Procesamiento de Secuencias En una fábrica se coloca un sensor de temperatura y los valores sensados se registran en un archivo llamado sensor.txt, junto con la hora y los minutos de sensado. El contenido del archivo puede ser por ejemplo: 18.5 10 30 16.8 10 32 15.2 10 40 17 10 45 17.5 10 55 A partir de sensor.txt generar dos archivos menores.txt y mayores.txt. El primero contiene los valores menores a cierta temperatura t y el segundo los valores mayores o iguales a t. En cada caso el valor está seguido por las horas, el signo : y los minutos. 15 Procesamiento de Secuencias program SensorMenMay; var hora, minutos: integer; temp, t: real; s, men, may : text; begin assign (s, 'c:\archivos\Sensor.txt'); assign (men, 'c:\archivos\Menores.txt'); assign (may, 'c:\archivos\Mayores.txt'); reset(s); rewrite(men); rewrite(may); write(‘Ingrese la temperatura de referencia: ‘); read(t); … close (s); close (men); close (may); end. 16 Procesamiento de Secuencias En una fábrica se colocan dos sensores de temperatura, uno en el Norte y otro en el Sur. Los sensores están sincronizados y los valores sensados se registran en dos archivos Norte.txt y Sur.txt respectivamente. Problema: Recorrer ambos archivos y generar un tercero llamado MayorTemp.txt en el que se guarde la temperatura mayor entre las dos registradas y el sector en el que se registró dicha temperatura. Si son iguales, indicarlo. Por ejemplo si Norte.txt es 15 17 12.5 18.5 y Sur.txt es 14 17 14 15 el archivo Mayor.txt contendrá: 15 Norte 17 iguales 14 Sur 18.5 Norte … while not eof(s) do begin readln (s, temp, hora, minutos); if temp < t then writeln (men, temp, ‘ ’, hora, ‘ : ’, minutos) else writeln (may, temp, ‘ ’, hora, ‘ : ’, minutos); end; … 17 Puede asumir que ambos archivos tienen igual cantidad de elementos. 18 Procesamiento de Secuencias Procesamiento de Secuencias while not eof(n) and not eof(s) do begin read (n, tempN); read (s, tempS); if tempN > tempS then writeln (m, tempN, ' Norte') else if tempN = tempS then writeln (m, tempN, ' Iguales') else writeln (m, tempS, ' Sur') end; read (n, tempN); read (s, tempS); if tempN > tempS then writeln (m, tempN, ' Norte') else if tempN = tempS then writeln (m, tempN, ' Iguales') else writeln (m, tempS, ' Sur') 19 Procesamiento de Secuencias 20 Procesamiento de Secuencias program Sensores; var tempN,tempS:real; n,s,m : text; begin assign (n, 'c:\archivos\Norte.txt'); assign (s, 'c:\archivos\Sur. txt'); assign (m, 'c:\archivos\MayorTemp.txt'); reset (n); reset (s); rewrite(m); … close (s); close (n); close (m); end. Modifique la solución anterior considerando que si un sensor deja de funcionar antes que otro, a partir de ese momento se vuelcan en mayor.txt el resto de los datos del otro sensor. Por ejemplo si Norte.txt es 15 12.5 18.5 15 13.2 y Sur.txt es 14 14 15 el archivo Mayor.txt contendrá: 15 Norte 14 Sur 18.5 Norte 15 Norte 13.2 Norte Elija por lo menos 3 casos significativos para probar la solución. 21 Procesamiento de Secuencias 22 Procesamiento de Secuencias En una fábrica se colocan dos sensores de temperatura, uno en el Norte y otro en el Sur. Los valores sensados se registran en un archivo anotando la temperatura y de qué sensor se obtuvo: 15 N 14 S 16 N 20 S 23 S Generar dos archivos, uno con los registros del sensor del Norte y otro con los del Sur. 23 … var f, N, S: text; temp: integer; s: char; Begin … // asignar los tres archivos reset(f); rewrite(N); rewrite(S); while not eof(f) do begin readln(f, temp, s); if (s=‘N’) then writeln(N, temp) else writeln(S, temp); … end; close(f); close(N); close(S); … Procesamiento de Secuencias Procesamiento de Secuencias Procesamiento clásico de un archivo de tipo text accedido caracter por caracter: Procesamiento clásico de un archivo de tipo text accedido caracter por carácter si necesitamos analizar su contenido línea a línea: reset(t); while not eof(t) do begin … while not eof(t) and not eoln(t) do begin read(t, ch); … end; if eoln(t) then readln(t); … end; close(t); Procesamiento de Secuencias Procesamiento de Secuencias Una línea Procesamiento de Secuencias Procesamiento de Secuencias Leer 7 Leer 11 Calcular 4 y agregar al archivo Leer 8 Calcular -3 y agregar al archivo Leer 10 Calcular 2 y agregar al archivo … Leer 5 Calcular -3, agregar al archivo y terminar Leer un archivo conteniendo las temperaturas mínimas diarias de un período y generar otro archivo con las diferencias de temperaturas entre cada día y el anterior. Por ejemplo, si el contenidos del archivo es: 7 11 8 10 11 11 15 8 5 El archivo generado será 4 -3 2 1 0 4 -7 -3 Para estudiar en casa Identificamos las estructuras de control y generalizamos 29 read(tm, t1); read(tm, t2); diferencia := t2-t1; write(d, diferencia); t1:=t2; read(tm, t2); diferencia := t2-t1; write(d, diferencia); t1:=t2; read(tm, t2); diferencia := t2-t1; write(d, diferencia); t1:=t2; 30 Procesamiento de Secuencias … read(tm, temp1); while not eof(tm) do begin read (tm, temp2); dif := temp2 - temp1; write (d, dif); temp1 := temp2; end; … Qué sucede si el archivo está vacío? Procesamiento de Secuencias Procesamiento de Secuencias program difEntreDias; var temp1, temp2, dif: integer; tm, d: text; begin assign (tm,'tempMin.txt'); assign (d,'difDias.txt'); reset (tm); rewrite (d); if not eof(tm) then read(tm, temp1); while not eof(tm) do begin read (tm, temp2); dif := temp2 - temp1; Manejo de pares de elementos write(d, dif:8:2); adyacentes en el archivo. temp1 := temp2; end; close (tm); close (d); end. Procesamiento de Secuencias Implementamos programas que procesan secuencias de elementos. Diferencia entre file of char y text: Ambos son archivos de caracteres, pero el text separa las líneas con eoln. • Además del archivo de texto podemos leer, como desde la consola, datos de tipos mezclados. Pascal realiza una conversión automática en los tipos de los datos leídos de archivos de tipo text. • La secuencia puede leerse desde: • La consola • Un archivo Los elementos pueden ser: • números • caracteres La secuencia puede: • Tener una longitud fija, establecida por el usuario (de consola). • Terminar con un valor particular (de consola). • Terminar cuando la función eof computa true (de archivo).