Академический Документы
Профессиональный Документы
Культура Документы
DEPARTAMENTO DE COMPUTACIN
PROGRAMACIN 2
PRCTICA DE LABORATORIO 12
Introduccin
Un archivo es un grupo de registros relacionados almacenados en
memoria secundaria. Por ejemplo, un archivo de nmina de una
compaa contiene normalmente un registro por cada empleado. De
esta manera, el archivo de nmina de una compaa pequea podra
contener slo 20 registros y, en cambio un archivo de nmina de
una compaa grande podra contener hasta 50.000 registros.
La ventaja es que la informacin almacenada en un archivo es
persistente en el tiempo, no es susceptible a fallas elctricas y
puede reproducirse y transportarse a bajo costo.
Archivos de encabezado
Para realizar el procesamiento de archivos en C++ se deben incluir
los archivos de encabezado <iostream.h> y <fstream.h>. El archivo
<fstream.h> incluye las definiciones para las clases ifstream
(para entrada desde un archivo), ofstream (para salida hacia un
archivo) y fstream (para entrada y salida de un archivo).
ios
istream
ifstream
ostream
iostream
ofstream
fstream
Abrir Archivos
El mtodo open(), heredado por todas las clases del flujo de
archivos, permite asociar el objeto del flujo de archivos (archivo
lgico) a un archivo fsico en disco y luego abrirlo para su
acceso. La forma de llamar a este mtodo es:
<objeto de flujo de archivo>.open (<nombre del archivo fsico>,
<modo de apertura de archivo>);
lectura.open("ejemplo1.txt");
// Archivo lgico escritura que escribe al archivo de disco ejemplo2.txt.
escritura.open("ejemplo2.txt");
// Archivo logico lescturaEscritura que lea y escriba el archivo ejemplo3.txt.
Descripcin
Anexa toda la salida al final del archivo
ios::ate
ios::in
ios::out
ios::nocreate
ios::noreplace
ios::trunc
ios::binary
Cerrar archivos
Despus de terminar el procesamiento del archivo, deber cerrar el
archivo para garantizar su contenido y permitir su posterior uso.
Esto se realiza con la funcin close() Para cerrar un archivo, lo
que necesita hacer es llamar al mtodo close() con un objeto de
flujo
de
archivo.
Como
resultado,
los
enunciados
lecturaEscritura.close(),
escritura.close()
y
lectura.close()
debern cerrar los archivos que se abrieron anteriormente.
salida.open("ejemplo-escribir.txt");
// Verificando la operacion -- si el archivo existe o no
if (!salida)
{
cout<<"No se puede abrir el archivo\n";
exit(1);
}
else
{
cout<<"Suministre el total de lineas del archivo: ";
cin>>numl;
for (i=0;i<numl;i++)
{
//Escritura de un archivo de texto
salida << i+1 <<"\n";
}
}
salida.close(); //Cierre del archivo
cout<<"****** Archivo Procesado ******\n";
return 0;
}
Se lee un archivo en disco con el objeto de flujo de archivo de
entrada y el operador de extraccin >>, tal como se usa el objeto
de flujo de archivo estndar cin y el operador >>. De esta manera,
luego de abrir un objeto de archivo de entrada las siguientes
instrucciones permiten leer la primera secuencia de caracteres
delimitada por el carcter espacio en blanco:
string cadena;
ifstream entrada;
entrada.open(ejemplo.txt);
entrada >> cadena;
cout << cadena << endl; // muestra lo ledo del archivo
entrada.close();
Ejecute el cdigo anterior y verifique lo que muestra por
pantalla, note que no es toda la lnea que contiene el archivo
ejemplo.tx. Note que la cadena se defini como un string por tanto
debe incluir la clase string de C++. Si desea obtener toda una
lnea del archivo de entrada (independientemente del nmero de
palabras) debe usarse la funcin getline, en lugar de entrada >>
cadena, de la siguiente forma:
getline(entrada, cadena, \n);
Copie, compile y ejecute el siguiente cdigo que muestra como leer
el archivo ejemplo-escribir.txt lnea a lnea y mostrarlo por
pantalla.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
string i;
ifstream entrada; // flujo de entrada
// Apertura del archivo: abrir un nuevo existente)
entrada.open("ejemplo-escribir.txt");
// Verificando la operacion -- si el archivo existe o no
if (!entrada)
{
cout<<"No se puede abrir el archivo\n";
exit(1);
}
else
{
/*
do
{
//Lectura de un archivo de texto
entrada >> i;
cout << i << endl; // muestra lo pantalla
} while (entrada);
*/
}
entrada.close();
//Cierre del archivo
cout<<"****** Archivo Procesado ******\n";
return 0;
}
Hay muchas formas de hacer un ciclo iterativo para leer un archivo
de forma secuencial lnea por lnea hasta el final. Las siguientes
son alternativas:
while (entrada >> i) {
cout << i << endl; // muestra lo pantalla
}
while (!entrada.eof()) {
entrada >> i;
cout << i << endl; // muestra lo pantalla
}
entrada >> i;
while (!entrada.eof()) {
cout << i << endl; // muestra lo pantalla
entrada >> i;
}
Sin embargo, la ltima alternativa deja de procesar la ltima
lnea. Esto se debe a que cuando se abre un archivo de lectura, un
cursor que forma parte del archivo lgico se ubica en la primera
lnea del archivo fsico, luego una vez leda la lnea el cursor
se ubica en la siguiente. Cuando se ejecuta eof(), este mtodo
return 0;
}
El archivo ejemplo-escribir2.txt para un valor numl = 3 es el
siguiente:
1 3
2 4
3 5
De la misma forma puede escribirse y leer un registro (struct de
C++) sobre un archivo de texto, de la siguiente forma:
struct datos{
int ci;
string nombre;
};
. . .
ofstream salida(ejemplo3.txt);
datos D;
salida << D.ci << "\t" << D.nombre <<"\n";
salida.close();
. . .
ifstream entrada("ejemplo-escribir3.txt");
datos D1;
entrada >> D1.ci >> D1.nombre;
entrada.close();
Si el campo nombre puede esta formado por ms de una palabra
entonces debe usarse getline para leer toda la lnea y procesarla
con los mtodos de la clase string, pues el operador >> y << no
servirn en este caso.
Ejercicio
1. El departamento de Robtica de una compaa tiene varios
tipos de robots. Para cada robot se tiene un archivo de texto
secuencial (Archivo 1) que contiene los registros de las
rdenes vlidas formadas por 2 campos:
Archivo 1
BRAZOD ABA
BRAZOD ARR
CABEZA ARR
CABEZA DER
CABEZA IZQ
MANOD
IZQ
Archivo1
Archivo2
Archivo 1
Archivo 2
Validador
(a)
Filtro (b)
Invlido
Ordenes Invlidas
PIED
DER
BRAZOD
DER
MANOI
ARR
PIEI
IZQ
BRAZOI
IZQ
Ordenes Vlidas
CABEZA
ARR
CABEZA
DER