Professional Documents
Culture Documents
1 de noviembre de 2002
1. Streams
En C++, los archivos se manejan con un tipo particular de stream. Un stream
es una estructura de datos que se utiliza para manejar un “flujo de caracteres”
y permitir poner o sacar de él tipos de datos estándar o clases definidas por el
usuario. Por ejemplo, cout es un stream que nos permite escribir caracteres en
la consola. Repasemos un poco el funcionamiento de cout y cin:
#include <iostream>
void main()
{
int n;
En este ejemplo podemos ver los dos operadores principales que se usan para
trabajar con streams: << para streams de salida y >> para streams de entrada.
Para recordar mejor el significado de estos operadores, podemos pensar que <<
“pone” las cosas en el stream y que >> las “saca”. Además, podemos ver que
ambos operadores “saben” convertir entre enteros y caracteres, en el sentido en
que corresponda. Estos dos operadores se pueden definir para cualquier clase,
pero nosotros no vamos a trabajar con entrada y salida redefiniéndolos.
cin es un ejemplo de un istream y cout es un ejemplo de un ostream.
1.1. >>
Este operador, también llamado “de extracción”, saca cosas de un stream
y las coloca en la variable recibida como parámetro. En su comportamiento
por defecto, este operador ignora los espacios en blanco. Para entender esto,
supongamos que el stream contiene lo siguiente:
1 2 3 4
|
1
AyEDI — 2do cuatrimestre de 2002 2
donde i es una variable de tipo int, i va a pasar a valer 1 y el estado del stream
va a ser
2 3 4
|
Si nuevamente hacemos
cin >> i;
el programa va a saltear el espacio, va a poner el 2 en i y va a dejar el puntero
en el siguiente espacio en blanco. Es decir, al leer de un stream, por defecto, se
ignoran los espacios en blanco.
1.2. Manipuladores
Para cambiar el comportamiento de un stream, se pueden utilizar ciertas
funciones especiales, llamadas manipuladores. Los manipuladores están defini-
dos en el archivo iomanip. Veamos algunos de los más útiles.
1.2.1. endl
Para marcar el final de una lı́nea en un stream de salida, podemos usar el
manipulador endl
#include <iostream>
#include <iomanip>
void main()
{
cout << "Hola!" << endl;
cout << "| este palito esta justo abajor de la H" << endl;
}
void main()
AyEDI — 2do cuatrimestre de 2002 3
{
char c;
cout << "Ingrese dos digitos separados por un espacio" << endl;
cin >> c; cout << c;
cin >> c; cout << c << endl;
cout << "Ingrese dos digitos separados por un espacio" << endl;
cin >> noskipws >> c;
cin >> c; cout << c;
cin >> c; cout << c;
cin >> c; cout << c;
}
Si el usuario ingresa
1 2
1 2
Obtiene la siguiente salida
1 2
12
1 2
1 2
Para deshacer el efecto de noskipws, simplemente utilizamos skipws.
void main()
{
cout << true << endl;
}
La salida de este programa es
1
true
Nuevamente, para deshacer el efecto de boolalpha, utilizamos noboolalpha.
AyEDI — 2do cuatrimestre de 2002 4
2. Archivos
En C++, los archivos se manejan mediante filestreams o fstreams. Estos
son streams que además proveen funciones para manipular archivos. Es decir, si
nuestro programa escribe cosas en la consola, con los mismos comandos podemos
escribir cosas en un archivo. Simplemente hay que cambiar cout por el nombre
del stream que maneje nuestro archivo.
2.1. Entrada
Para abrir un archivo para lectura, utilizamos un ifstream. Para eso, te-
nemos que definir una variable de ese tipo y vincularla a algún archivo. Para
realizar esta vinculacion, tenemos dos métodos: dar el nombre del archivo al de-
clarar la variable o utilizar el método open. Ambos producen el mismo resultado.
Veamos un ejemplo.
#include <iostream>
#include <fstream>
#include <iomanip>
void main()
{
ifstream entrada("Hola.txt");
ifstream input;
char c;
input.open("Hello.txt");
if (entrada.good())
cout << "El archivo Hola.txt fue abierto correctamente";
else
cout << "El archivo Hola.txt no pudo ser abierto correctamente";
cout << endl;
entrada >> c;
entrada.close();
input.close()
2.2. Salida
Para manejar un archivo de salida, utilizamos un ostream
#include <iostream>
#include <fstream>
#include <iomanip>
void main()
{
ofstream salida("Hola.txt");
ofstream output;
char c;
output.open("Hello.txt");
cin >> c;
salida << c;
salida.close();
output.close();
}
3. Enum
enum es un mecanismo del lenguaje para definir constantes simbólicas. Por
ejemplo, si queremos representar los palos de una baraja francesa en C++, crear
una clase puede ser demasiado, ya que solo tenemos que tratar con cuatro valores
sencillos. Entonces, recurrimos al enum.
#include <iostream>
#include <iomanip>
AyEDI — 2do cuatrimestre de 2002 6
void main()
{
Palo p;
p = Corazones;
cin >> c;
p = Palo(c);
dejará en p el valor Piques.
4. DJGPP
El compilador que la cátedra utiliza no cumple en un 100 % con el estándar
ANSI C++. En particular, no posee manipuladores (a excepción de endl y
AyEDI — 2do cuatrimestre de 2002 7
algún otro no muy relevante). De todas formas, sı́ brinda una forma de cambiar
el comportamiento de un istream respecto a los espacios en blanco. Para hacer
que éstos no sean ignorados, debemos usar el método unsetf de la siguiente
forma
cin.unsetf(ios::skipws);
Si queremos volver a ignorar los espacios en blanco, hacemos
cin.setf(ios::skipws);