Está en la página 1de 7

Manejo de archivos en C++

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 ujo de caracteres y permitir poner o sacar de l tipos de datos estndar o clases denidas por el e a 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> using namespace std; void main() { int n; cout << "Ingrese un numero entero" << endl; cin >> n; cout << "El numero que usted ingreso es el " << n << endl; } 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 signicado de estos operadores, podemos pensar que << pone las cosas en el stream y que >> las saca. Adems, podemos ver que a ambos operadores saben convertir entre enteros y caracteres, en el sentido en que corresponda. Estos dos operadores se pueden denir para cualquier clase, pero nosotros no vamos a trabajar con entrada y salida redenindolos. e cin es un ejemplo de un istream y cout es un ejemplo de un ostream.

1.1.

>>

Este operador, tambin llamado de extraccin, saca cosas de un stream e o y las coloca en la variable recibida como parmetro. En su comportamiento a por defecto, este operador ignora los espacios en blanco. Para entender esto, supongamos que el stream contiene lo siguiente: 1 2 3 4 |

AyEDI 2do cuatrimestre de 2002

(| indica dnde se va a realizar la prxima extraccin). Si la siguiente instruccin o o o o de nuestro programa es cin >> i; 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 estn denia dos en el archivo iomanip. Veamos algunos de los ms utiles. a 1.2.1. endl

Para marcar el nal de una l nea en un stream de salida, podemos usar el manipulador endl #include <iostream> #include <iomanip> using namespace std; void main() { cout << "Hola!" << endl; cout << "| este palito esta justo abajor de la H" << endl; } 1.2.2. skipws, noskipws

Si estamos trabajando con un stream de entrada, y queremos que >> no ignore los espacios en blanco, el manipulador noskipws es justo lo que necesitamos. Veamos un ejemplo: #include <iostream> #include <iomanip> using namespace std; void main()

AyEDI 2do cuatrimestre de 2002

{ 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. 1.2.3. boolalpha, noboolalpha

A menudo utilizamos el stream de salida por consola para conocer el valor de las variables de nuestro programa en distintos momentos. Cuando pedimos mostrar una variable de tipo bool, obtenemos un 0 o un 1. Si queremos algo un poco ms signicativo, podemos utilizar el manipulador boolalpha. a #include <iostream> #include <iomanip> using namespace std; void main() { cout << true << endl; cout << boolalpha << true << endl; } La salida de este programa es 1 true Nuevamente, para deshacer el efecto de boolalpha, utilizamos noboolalpha.

AyEDI 2do cuatrimestre de 2002

2.

Archivos

En C++, los archivos se manejan mediante lestreams o fstreams. Estos son streams que adems proveen funciones para manipular archivos. Es decir, si a 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, tenemos que denir una variable de ese tipo y vincularla a algn archivo. Para u realizar esta vinculacion, tenemos dos mtodos: dar el nombre del archivo al dee clarar la variable o utilizar el mtodo open. Ambos producen el mismo resultado. e Veamos un ejemplo. #include <iostream> #include <fstream> #include <iomanip> using namespace std; 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() cout << c << endl; } En este ejemplo, nuestro programa abre dos archivos para entrada y lee un caracter de uno de ellos. Cuando los archivos ya no son necesarios, los cerramos utilizando el mtodo close. Una vez que cerramos el archivo, podemos usar el e mismo ifstream para leer de otro archivo distinto, o del mismo archivo una vez ms. a Adems de la apertura de archivos de entrada, vemos el uso del mtodo a e good. Este mtodo est presente en todos los streams y nos indica si la prxima e a o

AyEDI 2do cuatrimestre de 2002

operacin de lectura/escritura ser viable. En el caso de archivos, preguntar o a good despus de abrir un archivo nos informa si se pudo abrir correctamente. e Cuando se trabaja con streams de entrada, a menudo es necesario leer un caracter y volverlo a poner dentro del stream. Para eso, los istreams poseen el mtodo putback(char), que coloca el caracter en el stream, pasando a ser el e prximo caracter que se leer. o a Otro mtodo util para manipular ifstreams es eof(). Este nos dice si ya e llegamos al nal del archivo. Eso quiere decir que ya no se podr leer ms. a a

2.2.

Salida

Para manejar un archivo de salida, utilizamos un ostream #include <iostream> #include <fstream> #include <iomanip> using namespace std; void main() { ofstream salida("Hola.txt"); ofstream output; char c; output.open("Hello.txt"); cin >> c; salida << c; salida.close(); output.close(); } En este ejemplo, no revisamos si el archivo fue abierto correctamente. Si el archivo no existe, se crear. Solo puede haber problemas si no se puede crear a un archivo con ese nombre en el directorio o si alguien tiene el archivo abierto. C++ permite abrir un archivo para escribir y leer de l, pero no utilizaremos e este tipo de fstream en la materia.

3.

Enum

enum es un mecanismo del lenguaje para denir constantes simblicas. Por o 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

using namespace std; enum Palo {Corazones = C, Treboles = T, Diamantes = D, Piques = P}; void main() { Palo p; p = Corazones; cout << p << endl; cout << char(p); } En este ejemplo, asignamos a cada una de las constantes simblicas (Corazones, o etc.) un caracter. Ese caracter podr usarse, por ejemplo, para almacenar el palo a en un archivo. La salida de este ejemplo es 67 C Esto nos muestra que C++ trata a los enum como enteros. Si queremos ver (o guarda en un archivo) el caracter correspondiente al palo, debemos encerrar la variable en un char(). Una forma alternativa de leer y escribir enums en streams es usar los mtodos e put y get. Estos solo manejan un caracter. Entonces, si queremos escribir en patalla un Trebol, podemos hacer cout.put(Trebol); cout << endl; Esto nos dar a T Leer un enumerado es ms complicado. Debemos poner el contenido en un char a y despus asignarlo al enumerado. Si el usuario ingresa P e char c; Palo p; cin >> c; p = Palo(c); dejar en p el valor Piques. a

4.

DJGPP

El compilador que la ctedra utiliza no cumple en un 100 % con el estndar a a ANSI C++. En particular, no posee manipuladores (a excepcin de endl y o

AyEDI 2do cuatrimestre de 2002

algn otro no muy relevante). De todas formas, s brinda una forma de cambiar u el comportamiento de un istream respecto a los espacios en blanco. Para hacer que stos no sean ignorados, debemos usar el mtodo unsetf de la siguiente e e forma cin.unsetf(ios::skipws); Si queremos volver a ignorar los espacios en blanco, hacemos cin.setf(ios::skipws);

También podría gustarte