Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Entrada y Salida Estándar • La sobrecarga del operador “<<” y “>>” permite generar entrada/salida de distinto objetos utilizando una única sentencia. 3.7 C++: Entrada y Salida cout << “Esto saldrá por la salida estándar (pantalla) << x ; cin >> Nombre; // Ingreso desde la Entrada estándar • Nótese que no se requiere indicar el tipo de dato (como ocurre con printf, scanf, etc.). 1 III-2 Departamento de Informática Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Streams Ejemplo de Streams • Streams estándares: int main (void) { int input; cout << “Ingrese un numero distinto de cero\n”; cin >> input; if (input == 0) cerr << “Error: Ingreso Invalido\n”; cout << “Recíproco:” << 1.0 / input; return 0; } – cin corresponde al stream estándar de entrada – cout es el stream estándar de salida – cerr el stream estándar de salida de errores • Para usar otros archivos o dispositivos, se deben crear los streams apropiados y asociarlos a los respectivos dispositivos o archivos. III-3 Departamento de Informática Universidad Técnica Federico Santa María III-4 Departamento de Informática Lenguajes de Programación Lenguajes de Programación Universidad Técnica Federico Santa María Streams de Entrada/Salida Jerarquía de clases para Streams • Un ostream es un mecanismo para convertir valores de varios tipos en una secuencia de caracteres. • Un istream provee el manejo de la entrada. • Ambas clases se definen en <iostream.h> (que se compone de istream y ostream) ios_base ios istream istrstream ifstream iostream fstream III-5 ostream ofstream ostrstream strstream III-6 Departamento de Informática Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Universidad Técnica Federico Santa María Salida de Tipos Definidos por el Usuario Entrada de Tipos Definidos por el Usuario • Se debe sobrecargar “<<”. Por ejemplo: • Al igual que con ostream, istream provee el operador “>>” para un conjunto de tipos estándares. class complejo { public: double real() {return re;} double imag() { return im; } ... }; • El operador “>>” se puede sobrecargar para un tipo definido por el usuario. • Ejemplo: leer un número complejo con formatos // A continuación, se sobrecarga “<<” ostream & operator<<(ostream&s, const complejo& z) { return s << ‘(‘ << z.real() << ‘,’ << z.imag() << ‘)’; } – float – (float) – (float, float) // sólo parte real // idem // parte real e imaginaria III-7 Departamento de Informática III-8 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Ejemplo: Entrada de Tipos Definidos por el Usuario Lenguajes de Programación Manejo de Archivos istream& operator>>(istream& s, complejo& a) { double re = 0, im =0; char c = 0; s >> c; // se lee el primer caracter if (c == ‘(‘) { s >> re >> c; //se lee parte real y el siguiente carácter if (c == ‘,’) // Ahora viene la parte imaginaria s >>im >> c; if (c != ‘)’) //Ooops! Mal formato } else { s.putback(c); //Solo viene la parte real.... s >> re; // comer parte real } if (s) a=complejo(re,im); // construir el número complejo return s; • cin, cout, cerr están asociados a los dispositivos “por defecto” • El usuario puede crear sus propios streams. • Los streams se asocian a un determinado dispositivo. • En el caso de archivos, se incluye el header <fstream.h> } III-9 Departamento de Informática III-10 Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Universidad Técnica Federico Santa María Ejemplo: Lenguajes de Programación Streams de Strings Copiar un archivo a otro int main(int argc, char *argv[]) { if (argc!=3) error(“Número de argumentos incorrecto”); ifstream desde(argv[1]); if (!desde) error(“No se puede abrir archivo”, argv[1]); ofstream hacia(argv[2]); if (!hacia) error(“No se puede abrir archivo”, argv[2]); char ch; while (desde.get(ch)) hacia.put(ch); // copiar caracteres if (!desde.eof() || hacia.bad() ) error(“Pasó algo raro”); return 0; • Un stream también puede asociarse a un string • De esta manera, se puede: – Leer desde un string – Escribir hacia un string • Estos streams se denominan strstreams • Se definen en <strstream.h> } III-11 III-12 Departamento de Informática Universidad Técnica Federico Santa María Departamento de Informática Lenguajes de Programación Universidad Técnica Federico Santa María Lenguajes de Programación Entrada a Streams de Strings Salida a Streams de Strings • Salida a Strings: ostrstreams • Entrada desde Strings: istrstream string crear_mensaje_error(int n, const string& cs ) { extern const char * msgs[]; ostrstream ost; ost << “error(“ << n << “):” <<msgs[n] << “ (comentario:” << cs <<“)”; return ost .str(); } void palabras_por_linea( const string& s) { istrstream ist(s); string w; while (ist >>w) // obtener palabra desde el string s cout <<w << ‘\n’; } • Este ejemplo, formatea un string para su posterior despliegue III-13 Departamento de Informática Universidad Técnica Federico Santa María Lenguajes de Programación Entrada/Salida C • C++ permite utilizar las funciones de entrada y salida de C, entre otras: int printf(const char* format, ...); int fprintf(FILE*,const char* format, ...); int sprintf(char*p, const char*format,...); • La ventaja de los streams sobre las funciones C, es que utilizan un estilo común para especificar E/S de objetos construidos por el usuario, y además son realizan una verificación segura de tipos. III-15 III-14