Entrada / Salida Streams

Anuncio
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
Descargar