Entrada / Salida C++ Procedimental Streams 1 E/S Consola • Variables (iostream.h) – cin: entrada estándar (istream) – cout: salida estándar (ostream) – cerr: salida de error (ostream) • Operadores básicos – Entrada: >> istream &operator>>(istream &is, <tipo> &var) – Salida: << ostream &operator<<(ostream &os, <tipo> var) Manipuladores • Modifican la entrada o la salida • Sin argumentos (iostream.h) – – – – – – – dec: base decimal (E/S) hex: base hexadecimal (E/S) Cambian el estado oct: base octal (E/S) ws: desprecia blancos (E) endl: inserta ‘\n’ y vuelca el buffer (S) ends: inserta ‘\0’(S) flush: vuelca el buffer (S) 2 Manipuladores • Ejemplo: int v1=27, v2=34; cout << hex << v1 << “ “ << v2 << endl; cout << oct << v1 << “ “ << v2 << endl; cout << dec << v1 << “ “ << v2 << endl; 1b 22 33 42 27 34 Manipuladores • Con argumentos (iomanip.h) – – – – – – setbase(int): establece la base [8, 10, 16] (E/S) resetiosflags(long): desactiva flags del stream (E/S) setiosflags(long): activa flags del stream (E/S) setfill(int): establece el carácter de relleno (S) setprecision(int): establece precisión de los reales (S) setw(int): establece un ancho de salida (S) 3 Manipuladores • Ejemplo: int i=30; float f=123.4565784; cout cout cout cout << << << << i << endl; setw(10) << setfill(‘.’) << i << endl; i << endl; f << endl << setprecision(4) << f << endl; 30 ........30 30 123.457 123.5 Manipuladores (flags) • Flags de estado (clase ios) – – – – – – – – – – – – – – – ios::skipws: Saltar espacios en la entrada ios::left: Justificar a la izquierda ios::right: Justificar a la derecha ios::internal: Justificar después de signo o base ios::dec: Conversión decimal ios::hex: Conversión hexadecimal ios::oct: Conversión octal ios::showbase: Mostrar la base ios::showpoint: Mostrar el punto decimal ios::uppercase: Salida hexadecimal en mayúsculas ios::showpos: Poner signo a números positivos ios::scientific: Escribir números reales en notación científica ios::fixed: Usar punto decimal fijo en números reales ios::unitbuf: Vaciar después de cada inserción ios::stdio: Vaciar cout, cerr en cada inserción 4 Manipuladores • Ejemplo: int num=123; cout << hex; cout << setw(10) << num << ‘.’ << endl; cout << setw(10) << setiosflags(ios::left | ios::showbase) << num << ‘.’ << endl; cout << dec; 0x7b 7b. . Manipuladores • Ejemplo: double d1 = 34564.56789, d2 = 0.45678, d3 = 3456578.4, d4 =6; cout << setiosflags(ios::fixed) << setprecision(2); cout << d1 << endl << d2 << endl << d3 << endl; cout << d4 << endl; 34564.57 0.46 3456578.40 6.00 5 E/S sin formato • Métodos (iostream.h) – – – – – – – – – – – gcount: número de caracteres leídos (E) get: leer un carácter o una cadena de caracteres (E) getline: leer hasta ‘\n’ read: leer una serie de bytes (E) seekg: cambiar posición de lectura en fichero (E) tellg: obtener posición de lectura en fichero (E) flush: volcar el stream de salida (S) put: escribir un carácter (S) write: escribir un buffer de caracteres (S) seekp: cambiar posición de escritura en fichero (S) tellp: cambiar posición de lectura en fichero (S) Gestión de errores • Métodos (iostream.h) – eof(): indica si se ha llegado al final del fichero – fail(): indica si la última operación falló – bad(): indica que el stream está en estado de error – good(): indica que no hay ningún problema en el stream – clear(int): define el nuevo estado del stream – operator void *: devuelve NULL si hay error – operator !: defuelve true si hay error 6 Gestión de errores // Leer enteros del teclado escribirlos eof o error int x; while (cin >> x) cout << x; // Leer caracteres y contarlos int i, car[1024]; for (i=0; (cin) && (i<1024); i++) cin.get(car[i]); cout << “Leídos “ << i << “ caracteres” << endl; // Leer línea de hasta 200 caracteres char buffer[201]; if ( !cin.getline(buffer,201) ) cerr << “Error de lectura” << endl; E/S Ficheros • Clases fstream, ifstream, ofstream • Se puede usar todo lo anterior • Métodos nuevos: – constructor: puede abrir un fichero o usar un fd ya abierto – open(nombre, modo): abre un fichero • ios::in ? entrada • ios::nocreate ? no crea el fichero si no existe (entrada) • ios:out ? salida – close(): cierra el fichero 7 E/S Ficheros • Ejemplo: ifstream fent; char linea[256]; fent.open(“ent.txt”, ios::in | ios::nocreate); if (!fent) cerr << “No se puede abrir” << endl; else { while (!fent.eof()) { fent.getline(linea,256); if (!fent.eof()) { ... // Tratar línea } } } Sobrecarga de >> y << • E/S de tipos definidos por el programador • Ejemplo: struct TAlumno {...}; ostream & operator << (ostream &os, TAlumno &al) { os << “ALUMNO” << endl; os << “Nombre: “ << al.nombre << endl; ... return os; } ... TAlumno al; cout << al; 8