miércoles, 24 de octubre de 2012

USO DE ARCHIVOS


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 ´EL 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:


                UN ARCHIVO:

                ES UN GRUPO DE REGISTROS RELACIONADOS ALMACENADOS EN MEMORIA SECUNDARIA. POR EJEMPLO, UN ARCHIVO DE NÓMINA DE UNA COMPAÑÍA CONTIENE NORMALMENTE UN REGISTRO POR CADA EMPLEADO. DE ESTA MANERA, EL ARCHIVO DE NÓMINA DE UNA COMPAÑÍA PEQUEÑA PODRÍA CONTENER SÓLO 20 REGISTROS Y, EN CAMBIO UN ARCHIVO DE NÓMINA DE UNA COMPAÑÍA GRANDE PODRÍA CONTENER HASTA 50.000 REGISTROS. LA VENTAJA ES QUE LA INFORMACIÓN ALMACENADA EN UN ARCHIVO ES PERSISTENTE EN EL TIEMPO, NO ES SUSCEPTIBLE A FALLAS ELÉCTRICAS Y PUEDE REPRODUCIRSE Y TRANSPORTARSE A BAJO COSTO.

ARCHIVOS Y FLUJOS EN C++:

                 C++ VE A CADA ARCHIVO SIMPLEMENTE COMO UNA SECUENCIA DE BYTES QUE TERMINA CON UN MARCADOR ESPECIAL DE FIN DE ARCHIVO. LAS BIBLIOTECAS ESTÁNDAR DE C++ PROPORCIONAN UN AMPLIO CONJUNTO DE CAPACIDADES DE ENTRADA/SALIDA. EN GENERAL, LA E/S EN C++ SE DA EN FLUJO DE BYTES. UN FLUJO ES SIMPLEMENTE UNA SECUENCIA DE BYTES. EN LAS OPERACIONES DE ENTRADA, LOS BYTES FLUYEN DESDE UN DISPOSITIVO (POR EJEMPLO: TECLADO, UNIDAD DE DISCO, ETC.) HACIA LA MEMORIA PRINCIPAL. EN OPERACIONES DE SALIDA LOS BYTES FLUYEN DE LA MEMORIA PRINCIPAL HACIA UN DISPOSITIVO (POR EJEMPLO: PANTALLA, IMPRESORA, UNIDAD DE DISCO, ETC.). YA SE HA VISTO QUE EXISTEN CUATRO OBJETOS QUE SE CREAN ¡ AUTOMÁTICAMENTE CUANDO SE UTILIZA LA BIBLIOTECA IOSTREAM: CIN, COUT, CERR Y CLOG. ESTOS OBJETOS ASOCIAN CANALES DE COMUNICACIÓN ENTRE UN PROGRAMA Y UN ARCHIVO O DISPOSITIVO PARTICULAR. POR EJEMPLO, EL OBJETO CIN (FLUJO DE ENTRADA ESTÁNDAR) PERMITE QUE UN PROGRAMA RECIBA DATOS DESDE EL TECLADO; EL OBJETO COUT (FLUJO DE SALIDA ESTÁNDAR) PERMITE QUE UN PROGRAMA ENVÍE DATOS A LA PANTALLA, Y LOS OBJETOS CERR Y CLOG (FLUJO DE ERROR ESTÁNDAR) PERMITEN QUE UN PROGRAMA ENVÍE MENSAJES DE ERROR A LA PANTALLA.


ARCHIVOS DE ENCABEZADO:

                PARA REALIZAR EL PROCESAMIENTO DE ARCHIVOS EN C++ SE DEBEN INCLUIR
LOS ARCHIVOS DE ENCABEZADO <IOSTREAM.H> Y <FSTREAM.H>.

LA CLASE iftream, PARA DEFINIR LOS ARCHIVOS QUE SE USAN
EXCLUSIVAMENTE PARA ENTRADA DE DATOS (LEER).

LA CLASE oftream, PARA DEFINIR LOS ARCHIVOS QUE SE USAN
EXCLUSIVAMENTE PARA LA SALIDA DE DATOS (ESCRIBIR).

LA CLASE fstream, PARA DEFINIR ARCHIVOS DE ENTRADA Y/O SALIDA
DE DATOS.

EL SIGUIENTE PROGRAMA MUESTRA LA FORMA DE CREAR ESTOS OBJETOS DE
LA CLASE FSTREAM





EN C++, LOS ARCHIVOS SE MANEJAN MEDIANTE FILESTREAMS O FSTREAMS. ESTOS SON STREAMS QUE ADEM´AS 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.

ENTRADA:

                PARA ABRIR UN ARCHIVO PARA LECTURA, UTILIZAMOS UN IFSTREAM. PARA ESO, TENEMOS QUE DEFINIR UNA VARIABLE DE ESE TIPO Y VINCULARLA A ALG´UN ARCHIVO. PARA REALIZAR ESTA VINCULACION, TENEMOS DOS M´ETODOS: DAR EL NOMBRE DEL ARCHIVO AL DECLARAR LA VARIABLE O UTILIZAR EL M´ETODO OPEN. AMBOS PRODUCEN EL MISMO RESULTADO. VEAMOS UN EJEMPLO.


#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
int 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;
system("pause");
return 0;
}


     EN ESTE EJEMPLO, NUESTRO PROGRAMA ABRE DOS ARCHIVOS PARA ENTRADA Y LEE UNCARACTER DE UNO DE ELLOS. CUANDO LOS ARCHIVOS YA NO SON NECESARIOS, LOS CERRAMOSUTILIZANDO EL M´ETODO CLOSE. UNA VEZ QUE CERRAMOS EL ARCHIVO, PODEMOS USAR ELMISMO IFSTREAM PARA LEER DE OTRO ARCHIVO DISTINTO, O DEL MISMO ARCHIVO UNA VEZ MAS.ADEMAS DE LA APERTURA DE ARCHIVOS DE ENTRADA, VEMOS EL USO DEL METODOGOOD. ESTE M´ETODO EST´A PRESENTE EN TODOS LOS STREAMS Y NOS INDICA SI LA PROXIMA

                OPERACION DE LECTURA/ESCRITURA SERA VIABLE. EN EL CASO DE ARCHIVOS, PREGUNTAR GOOD DESPUES DE ABRIR UN ARCHIVO NOS INFORMA SI SE PUDO ABRIR CORRECTAMENTE.CUANDO SE TRABAJA CON STREAMS DE ENTRADA, A MENUDO ES NECESARIO LEER UNCARACTER Y VOLVERLO A PONER DENTRO DEL STREAM. PARA ESO, LOS ISTREAMS POSEEN ELMETODO putback (char), QUE COLOCA EL CARACTER EN EL STREAM, PASANDO A SER ELPROXIMO CARACTER QUE SE LEER´A. OTRO M´ETODO ´UTIL PARA MANIPULAR IFSTREAMS ES eof(). ESTE NOS DICE SI Y LLEGAMOS AL FINAL DEL ARCHIVO. ESO QUIERE DECIR QUE YA NO SE PODRA LEER MAS.


SALIDA:
PARA MANEJAR UN ARCHIVO DE SALIDA, UTILIZAMOS UN OSTREAM:

#include<iostream>
#include<fstream>
#include<iomanip>
usingnamespacestd;
voidmain()
{
ofstream salida("hola.txt");
ofstream output;
char c;
output.open("hello.txt");
cin>> c;
salida<< c;
salida.close();
output.close();
}





MANIPULADORES:

                PARA CAMBIAR EL COMPORTAMIENTO DE UN STREAM, SE PUEDEN UTILIZAR CIERTAS
FUNCIONES ESPECIALES, LLAMADAS MANIPULADORES. LOS MANIPULADORES EST´AN DEFINIDOS EN EL ARCHIVO IOMANIP. VEAMOS ALGUNOS DE LOS M´AS ´UTILES.

ENDL:
                PARA MARCAR EL FINAL DE UNA L´INEA EN UN STREAM DE SALIDA, PODEMOS USAR EL
MANIPULADOR ENDL

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
int main()
{
ofstream salida("hola.txt");
ofstream output;
char c;
output.open("hello.txt");
cin>> c;
salida<< c;
salida.close();
output.close();
system("pause");
return 0;
}




MODOS DE APERTURA DE ARCHIVO:

                DEPENDIENDO DEL PROPÓSITO DEL PROGRAMA DEBE INDICAR EL MODO DE
ACCESO, POR EJEMPLO ES POSIBLE QUE SEA NECESARIO AGREGAR DATOS A
LOS YA EXISTENTES EN EL ARCHIVO, O QUIZÁ QUE LAS OPERACIONES DEL
PROGRAMA NO SE LLEVEN A CABO EN CASO DE QUE EL ARCHIVO

ESPECIFICADO EXISTA EN EL DISCO, ETC., DEPENDIENDO DEL CASO
PODEMOS ESPECIFICAR EL MODO DE APERTURA SEGÚN LA SIGUIENTE TABLA:





CERRAR ARCHIVOS:

                DESPUÉS DE TERMINAR EL PROCESAMIENTO DEL ARCHIVO, DEBERÁ CERRAR EL ARCHIVO PARA GARANTIZAR SU CONTENIDO Y PERMITIR SU POSTERIOR USO. ESTO SE REALIZA CON LA FUNCIÓN close () PARA CERRAR UN ARCHIVO, LO QUE NECESITA HACER ES LLAMAR AL MÉTODO CLOSE() CON UN OBJETO DE FLUJO DE ARCHIVO. COMO RESULTADO, LOS ENUNCIADOS  LECTURA ESCRITURA. CLOSE (), ESCRITURA. CLOSE () Y LECTURA.close() DEBERÁN CERRAR LOS ARCHIVOS QUE SE ABRIERON ANTERIORMENTE.

ESTADO DE LAS OPERACIONES DE E/S SOBRE ARCHIVOS:

                SE RECOMIENDA UTILIZAR LOS SIGUIENTES MÉTODOS PARA VERIFICAR EL
ÉXITO DE LAS OPERACIONES DE, APERTURA, LECTURA Y ESCRITURA SOBRE
ARCHIVOS:

·         GOOD(): PRODUCE UN 1 SI LA OPERACIÓN PREVIA FUÉ EXITOSA.
·         EOF(): PRODUCE UN 1 SI SE ENCUENTRA EL FINAL DEL ARCHIVO.
·         FAIL(): PRODUCE UN 1 SI OCURRE UN ERROR.
·         BAD(): PRODUCE UN 1 SI SE REALIZA UNA OPERACIÓN INVÁLIDA.


ENUM:

           ENUM ES UN MECANISMO DEL LENGUAJE PARA DEFINIR CONSTANTES SIMB´OLICAS. 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>
using namespace std;
enum palo {corazones = 'c', treboles = 't',
diamantes = 'd', piques = 'p'};
int main()
{
palo p;
p = corazones;
cout << p << endl;
cout<< char(p);
cout<<"\n";
system("pause");
return 0;
}

                EN ESTE EJEMPLO, ASIGNAMOS A CADA UNA DE LAS CONSTANTES SIMB´OLICAS (CORAZONES,
ETC.) UN CARACTER. ESE CARACTER PODR´IA USARSE, POR EJEMPLO, PARA ALMACENAR EL PALO
EN UN ARCHIVO.

LA SALIDA DE ESTE EJEMPLO ES:
67
C




     AQUÍ LES DEJARE UN CÓDIGO DONDE SE PUEDE CREAR UN ARCHIVO INCLUYENDO LA EXTENSIÓN  Y  EL CONTENIDO INTERNO... LO DISEÑE YO  AUNQUE NO SE MUCHO  DE ESTO PERO ASÍ VOY APRENDIENDO Y USTEDES CONMIGO..! ES SIMPLE:



#include <fstream>
# include <iostream.h>
using namespace std;
int main(){
     menu:
    int a;
    system ("color 1e");
     cout<<"\t\t\t\tmenu de archivo\n";
     cout<<" 1 crear archivo\n";
     cout<<" 2 modificar archivo\n";
     cout<<" 3 salir\n";
     cin>>a;
  
if (a==1) {goto hola;}
if (a==2) {goto modificar_archivos;}
if (a==3) {exit (0);}
   modificar_archivos:
  int m;
cout<<" \t para modificar un archivo ya creado\n valla al menu, crear archivo y haga otro nuevo con el mismo nombre\n\n";
    cout<<"presione 1\n";
   cin>>m;
   if (m==1) system ("cls"); {goto menu;}
   hola:
        system ("cls");
        system ("color 2b");
cout<<"\nintrodusca el nombre del archivo seguido de la extension\n\n";
cout<<"\t ejemplo:  nombre.txt nombre.ppt nombre.txt nombre.doc nombre.pdf\n\n";

char nombre_de_archivo[15];

     cin>>nombre_de_archivo;
     if (nombre_de_archivo==0) {goto menu;}
         
          ofstream crear(nombre_de_archivo);// crear el archivo
          system ("cls");
          system ("color e9");
                   cout<<"introduce el contenido del doumento:\n";
char texto_archivo [1024];
     cin>>texto_archivo;
        cin.getline(texto_archivo,1024,'\n');
           crear<<texto_archivo;
               crear.close();
               system ("cls");
                  cout<<"el archivo a sido creado\n\n";
                  cout<<"\t que desea hacer..?\n\n";
                  cout<<" presione 1 para ir al menu\n\n";
                  cout<<" presione 3 para salir del programa\n";
                  int q;
                  cin>>q;
                  system ("cls");
                  if (q==1) {goto menu;}
                  if (q==3){exit (0);}
    
ifstream lectura(texto_archivo);//lectura de archivo
lectura.getline(texto_archivo,1024);
system ("pause");

return 0;


}






CABE DESTACAR QUE EL ARCHIVO SE CREARA Y SE GUARDARA EN LA MISMA CARPETA DONDE TENGAN GUARDADO EN CODIGO ASI COMO SE VE EN LA IMAGEN:













2 comentarios: