Computación II Clase 3 Strings - Archivos Roberto Konow Universidad Diego Portales Algunos ejemplos fueron extraidos de: The George Washington University Noticias Próximo Viernes 28 de Agosto: 11.20 AM Bolsa de comercio de Santiago Visita guiada Charla sobre el nuevo sistema transaccional desarrollado por ex alumnos UDP Este Viernes → Control Strings Archivos Notas del control + Pauta en la intranet Objetos Primera definición: Un objeto es una instancia de una clase, que comparte las propiedades definidas en la clase Generalmente una clase define propiedades y acciones (variables y funciones) Ejemplo de clase: Propiedades: Marca, Color, Tipo Acciones: Comprar, Beber, Botar Ejemplo de Objeto que instancia a la clase Cerveza: Una lata de Heineken Una botella de Cristal Strings Es una clase que ayuda a manejar las cadenas de carácteres. Ejemplos: “hola”, “computación”. Funciones útiles son la concatenación y la comparación Concatenación: “Informática”+“ Telecomunicaciones”=“Informatica Telecomunicaciones” Comparación: “aaaa”<“bbbbl” // alphabetical Buscar, obtener, modificar, eliminar, insertar “substrings dado un string” La clase String C++ tiene una libreria <string> . Incluirla en los programas cuando se necesite usar strings: #include <string>. En esta libreria la clase “string” esta definida e implementada. Es mucho mas fácil que utilizar la definición de String en C (arreglo de carácteres). Iniciación Las siguientes declaraciones son equivalentes. string x(“Informática Telecomunicaciones”); string x= “Informática Telecomunicaciones”; Operaciones con Strings Sea x e y dos Strings. Para concatenar x e y se escribe : “x+y”. string x= “Informática”; string y= “Telecomunicaciones”; string z; z=x+y; cout<<“z=“<<z<<endl; z =z+“ Son Rock Star”; cout<<“z=“<<z<<endl; Output: z=Informática Telecomunicaciones z= Informática Telecomunicaciones Son Rock Star Comparaciones usando Strings Podemos comparar dos strings utilizando los siguientes operadores booleanos: : ==, !=, <, <=, >, >= La comparación es alfábetica. El resultado será : true ó false. Ejemplos string x= “Informática”; char y[]= “Telecomunicaciones”; char *p = “Rock Star”; If (x<y) cout<<“x<y”<<endl; If (x<“árbol”) cout<<“x<tree”<,endl; If (“árbol” != x) cout<<“low != x”<<endl; if( (p>x) cout<<“p>x”<<endl; Else cout<<“p<=x”<<endl; Salida: x<y x<tree low != x p>x El operador índice Si x es un objeto de tipo string , y se desea obtener un el valor del k-ésimo carácter, se escribe: x[k] . string x= “hola”; char c=x[0]; // c es ‘h’ c=x[1]; // c es ‘o’ c=x[2]; // c es 'l' Esto hace que los strings se vean como arreglo de chars. Obtener el tamaño Para obtener el largo de un string x, se puede utilizar la función x.length() ó x.size(). Para revisar si el string es vacío (no tiene ningún carácter en él se usa x.empty() que retorna true o false. string x= “Informática”; int largo = x.length(); cout << “el largo del string x es: “ << largo << endl; if (x.empty()) { cout << “ El string x se encuentra vacío” << endl; } Obteniendo substrings Lógicamente un string es una secuencia de sub strings. Por ejemplo: “to” es parte del string “producto”. Para obtener una parte (substring) de un string se utiliza la función substr(inicio,fin). string y = x.substr(pos,len); string y = x.substr(pos);//x[pos..fin-1] Reemplazando un String dentro de otro Supongamos que x es un objeto de tipo string y que desea reemplazar en el rango [pos,pos+len] de x por y. Para hacerlo se escribe: x.replace(pos,len,y); Donde y es otro string. Eliminando un substring dentro de un string Para borrar un sub string en el rango [pos,pos+len] dentro de x se realiza: x.erase(pos,len); El valor de len es x.length() x.erase(pos); // elimina x[pos..end-1] Para borrar todo el contenido de x se realiza: x.clear( ); Búsqueda dentro de un string Para buscar por el string y en el string x se realiza: int posicion = x.find(y); Este método entrega la posición de la primera aparición del substring y en x de izquierda a derecha. Si no se encuentra, entregará el tamaño del string. Para buscar desde una posición pos dada : int posición = x.find(y, pos); Ejemplo El protocolo de correos electronicos (POP3, y SMTP) los mensajes vienen estructurados. Los programas que leen estos protocolos deben filtrar la información para que sea legible por el usuario En general el protocolo utiliza la sentencia “FROM:[email protected]” Escriba un programa que reciba un string de parámetro donde el string contiene una sentencia con la misma estructura descrita. El programa debe ser capaz de imprimir en pantalla el texto a partir de donde apárezca “FROM:” Ejemplo: “FROM: [email protected]“ El usuario es: [email protected] ¿Cómo se hace? string x=“FROM:[email protected]”; int dospuntos=x.find(‘:’); string prefijo=x.substr(0,dospuntos); //=FROM string sufijo = x. substr(dospuntos+1); cout<<“este mensaje es de: ”<<sufijo<<endl; Resumen Función Ejemplo Resultado Constructor string x = “rock” string y(“star”) Se inicializa el string x e y con el contenido “rock” y “star” correspondiente Concatenación string x = “rock”; string y = “ star”; string z = x+y; El string z quedará como “rock star” Comparación X == Y X <= Y X >= Y X != Y False False True True Indice X[i] X[1] Y[1] El i-ésimo elemento de X El segundo elemento de X ('o') El segundo elemento de Y ('t') Tamaño x.length() El tamaño de x = 4 Substring x.substr(inicio,fin) x.substr(0,2) Obtener el substring desde inicio hasta fin “roc” Reemplazar x.replace(inicio,fin,y) x.replace(0,2,y) Reemplazar en X[inicio,fin] por el string y Borrar Substring x.erase(inicio,fin) x.erase(0,2) Eliminar el contenido desde inicio hasta fin x = “k” Buscar posición x.find(“ck”) Retorna 2, la primera posición de izquierda a derecha Archivos Tres nuevas clases: ifstream Input file stream #include <ifstream> ofstream output file stream #include <ofstream> fstream file stream (input & output) #include <fstream> ofstream Funciones principales: Construcción: ofstream miArchivo(“archivo.txt”); ó ofstream miArchivo; miArchivo.open(“archivo.txt); Escritura: miArchivo << “texto a escribir”; Desconexión: miArchivo.close() ifstream Funciones principales: Construcción: ifstream miArchivo(“archivo.txt”); ó ifstream miArchivo; miArchivo.open(“archivo.txt); Lectura: string linea; getline(miArchivo,linea) miArchivo >> linea; Ifstream (cont.) Leer un caracter: miArchivo.get(ch) Cerrar: miArchivo.close() Otras propiedades ¿Cómo saber cuando es el final de un archivo? miArchivo.eof() Retorna true cuando se llega al final del archivo string line; ifstream myfile ("example.txt"); while (! myfile.eof() ) { getline (miArchivo,linea); cout << linea << endl; } Cada vez que se lee una linea se avanza en la lectura del archivo Tarea Descarar el archivo: http://pizzachili.dcc.uchile.cl/texts/nlang/english.gz (se descomprime con winrar) Leer todo el archivo con ifstream Cambiar todas las vocales por el caracter “-” Escribir en otro archivo llamado “tarea.txt” el texto cambiado del primer archivo. Leer el nuevo archivo y mostrar en pantalla la frecuencia de aparición de cada letra. Ejemplo Desde el archivo de lee la siguiente linea: “How do I learn the c++ programming language?” Se cambia el contenido al siguiente: “H-w d- I l—rn th- -++ pr-gr-mm-ng l-ng—ge? Se escribe esa linea en el archivo “tarea.txt” Se lee el contenido del archivo “tarea.txt” Despliega la información: H→1 w→1 d→1 I→2 r→2 … etc