Introducción a Patrones de Diseño en C++ con Qt4/1.12 Flujos
Flujos
[editar]Los flujos(Streams) son objetos usados para leer y escribir. La Librería Estándar define <iostream>, mientras que Qt define <QTextStream> para la funcionalidad equivalente.
iostream define los tres flujos globales:
- cin - entrada estándar (teclado)
- cout - salida estándar (pantalla de consola)
- cerr - error estándar (pantalla de consola)
Es fácil relacionar a QTextStreams con los mismos nombres como sus contrapartes iostream equivalentes.
- QTextStream cin(stdin);
- QTextStream cout(stdout);
- QTextStream cerr(stderr);
Los símbolos stdin, stdout, y stderr provienen de la librerñia estándar de C. QDebug() es también un flujo con una interface similar.
Los manipuladores tambien están definidos (en ambos, <iostream> y <QTextStream>), como flush y endl. Los manipuladores son llamadas explícitas a funciones que pueden cambiar el estado de un objeto de flujo en varias maneras. Un manipulador puede ser añadido para:
- Un flujo de salida para cambiar la forma en que el dato de salida es formateado.
- Un flujo de entrada para cambiar la manera en que el dato de entrada es interpretado.
Ejemplo 1.11
[editar]Salida:
4451 929 2345 1 true 1357 +1357 +1357.00 +1234.57 +1234.567800 +1.234568e+03 1.234568e+03
#include <iostream> int main() { using namespace std; int num1(1234), num2(2345) ; cout << oct << num2 << '\t' << hex << num2 << '\t' << dec << num2 << endl; cout << (num1 < num2) << endl; cout << boolalpha << (num1 < num2) << endl; double dub(1357); cout << dub << '\t' << showpos << dub << '\t' << showpoint << dub << endl; dub = 1234.5678; cout << dub << '\t' << fixed << dub << '\t' << scientific << dub << '\n' << noshowpos << dub << endl; }
Los flujos son usados para leer desde o escribir en archivos, conexiones de red y también cadenas. Una muy útil característica de los flujos es que ellos pueden hacer que sea secillo producir cadenas desde tipos de datos mixtos. En el Ejemplo 1.12 crearemos algunas cadenas desde numéricos y los escribiremos en un archivo.
Ejemplo 1.12
[editar]string strval = strbuf.str(); Convierte el flujo de carácteres en una cadena.
outf.open("midato"); Crea (o sobreescribe) un archivo del disco para la salida.
[ . . . . ] #include <iostream> #include <sstream> #include <fstream> int main() { using namespace std; ostringstream strbuf; int loco = 7; float pi=3.14; double e=2.71; /* Un flujo dentro de la memoria */ strbuf << "número loco " << loco << endl << "pi " << pi << endl << "e " << e << endl; string strval = strbuf.str(); cout << strval; /* Un flujo de archivo de salida. */ ofstream outf; outf.open("midato"); outf << strval ; outf.close();
Despues de que las cadenas han sido escritas, tenemos una variedad de opciones sobre como queremos leerlos. Podemos usar los operadores de entrada analógica con los que escribimos en nuestra salida, y dado que hay un espacio en blanco entre cada registro, el operador de inserción debería verse como en el Ejemplo 1.13
Ejemplo 1.13
[editar][ . . . . ] /* Un flujo de entrada de archivo */ ifstream archivoentrada; archivoentrada.open("midato"); string nuevacadena; int loco2; archivoentrada >> nuevacadena >> loco2; if (loco != lloco2) cerr << "¡ERROR! número loco incorrecto" << endl; float pi2; archivoentrada >> nuevacadena >> pi2; if (pi2 != pi) cerr << "¡ERROR! pi incorrecto." << endl; double e2; archivoentrada >> nuevacadena >> e2; if (e2 != e) cerr << "e2: " << e2 << " e: " << e << endl; archivoentrada.close();
En adición, podemos leer archivos línea por línea tratando a cada nueva línea como una cadena, justo como se muestra en el Ejemplo 1.14
Ejemplo 1.14
[editar][ . . . . ] /* Leer línea por línea */ archivoentrada.open("midato"); while (not archivoentrada.eof()) { getline(archivoentrada, nuevacadena); cout << nuevacadena << endl; } archivoentrada.close(); return 0; }