archivos de longitud variable con c++: operaciones 1

Bueno aquí tenemos un código del curso de organización de archivos, trata sobre las operaciones que podemos hacer con los registro de longitud variable ya que es mas complicado hacerlo que con longitud fija, sin embargo puse tan solo pocas operaciones como búsqueda, escritura, contar longitud, y la eliminación lógica del archivo. Dividiré el código en partes para poder explicarlo
Primero vemos que hay librerias desconocidas como io.h   sys\STAT.h FCNTL.h que son propias del compilador gcc que se instalar en windows, ademas se puede compilar con el IDE codeblocks (creo uno de los mejores IDE para compilar programas con C\C++), para linux tendríamos que descargar estas librerías y luego colocar la dirección en las librerías:


#include </usr/include/sys/io.h>//<io.h>/
#include <fcntl.h>
#include <sys/stat.h> 


vemos que también he declarado variables globales para no tener que pasar parámetros, y delimitadores cuya función es separar palabras ya que al guardar en el txt se verían así:
ejm:
                         daniel*cam*¶#danco*urbano♀#


viendo que los simbolos extraños son numeros grabado en ascii, pues en las variables globales edad es un entero

#include <cstdlib>
#include <iostream>
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <sys\STAT.h>
#include <FCNTL.h>
#define DELIM_C  "*"   //DELIMITADOR DE CARACTER
#define DELIM_R  "#"   //DELIMITADOR DE REGISTRO
using namespace std;

int fd=0;
char nombre[15], apellido[15];
int edad,A[20];

/*
ponemos las funciones u operación que se realizaran con lo archivos como
escribir, que tiene un puntero (fd) que señala a la funcion
creat(nombre_archivo, parámetro leer o escribir)
donde se guardaran en el archivo el nombre, apellidos y edad tambien hay
un arreglo que nos sera de gran 
ayuda para ver si existe logicamente el archivo.

*/

void escribir()
{    char op;

     if((fd = creat("a2.txt",S_IWRITE|S_IREAD)) < 0)//devuelve un entero si es q lo logra crear
       {
        cout<<"No se pudo crear"<<endl;
        system("PAUSE");
        exit(0);
       }
  do{

     fflush(stdin);
     cout<<"nombre:"; gets(nombre);
     cout<<"apellido:"; gets(apellido);
     cout<<"edad:"; cin>>edad;
     write(fd,nombre,strlen(nombre));
     write(fd,DELIM_C,1);
     write(fd,apellido,strlen(apellido));
     write(fd,DELIM_C,1);
     write(fd,&edad,2);  //recuerde los enteros se guardan como textos
     write(fd,DELIM_R,1);
     cout<<"desea continuar"<<endl;
     cin>>op;

     }while(op=='s');
  close(fd);
}

/*
esta función permite ver la longitud de cada registro ingresado(que existe), 
no  sin antes abrir (con Open) y leer (con la función R) con un contador desde cero 
 lo hará por cada caracter que lea hasta que lea los caracteres de registro lo  
  cual imprimira y se reiniciara el contador.

*/
void ver(){

     int c=0,i=0; char k;
      if((fd = open("a2.txt",O_TEXT)) < 0)//devuelve un entero si es q lo logra abrir
       {
        cout<<"No se pudo abrir"<<endl;
        system("PAUSE");
        exit(0);
       }

       while(read(fd,&k,1) > 0)
            {if((k!='*')&&(k!='#'))
                i++;
             if(k=='#')
             {  cout<<i<<endl; i=0; }
             }
       close(fd);
      }
/*
Se pide el numero de registro a buscar, siempre y cuando este exista en el 
areglo A que define si existe logicamente el registro(si el registro esta vigente 
es   porque A[numero]!=numero) y este conincida con la cantidad 
de '#' menos 1 cuando lo encuentre se imprime cada byte por byte (caracter por caracter),
 si ve el      simbolo '*'  mostrara un espacio en blanco,si ve un '#' saltara de linea

*/

void buscar(){
    int num_reg,cont=0,c=0,band=0;
    char k;

    cout<<"ingrese numero de registro: ";
    cin>>num_reg;
        if((fd = open("a2.txt",O_TEXT)) < 0){
                   cout<<"No se pudo abrir"<<endl;
                   system("PAUSE");
                   exit(0);
                }

      while(read(fd,&k,1) > 0)
 {
        if(cont==num_reg-1 && A[cont]!=cont ){

                if(k=='*')
                {
                    c++; cout<<" ";
                    if(c==2) {read(fd,&edad,2); //si lee 2 asteriscos, toca leer la edad
                    cout<<edad; c=0;}
                }
                else if(k=='#') {cout<<endl; band=1; break;}
                else cout<<k;
          }
          if(k=='#')
                cont++;

 }
if (band==0) cout<<"no se puede esta eliminado";

}

/*
la eliminacion logica la considere como una matriz en la cual me dira si esta 
borrada cuando contenga su mismo indice (por ejemplo A[3]=3)

*/

void eliminacion_logica(){
    int num_reg,num_el,cont=0,c=0,band=0;
    char k;
    cout<<"numero de registro para eliminacion logica: ";
    cin>>num_el;
    A[num_el-1]=num_el-1;
     cout<<"ingrese numero de registro para buscar :  ";
     cin>>num_reg;
        if((fd = open("a2.txt",O_TEXT)) < 0){
                   cout<<"No se pudo abrir"<<endl;
                   system("PAUSE");
                   exit(0);
        }


     while(read(fd,&k,1) > 0)
 {
        if(cont==num_reg-1 && A[cont]!=cont ){

           if(k=='*'){
                c++; cout<<" ";
                if(c==2) {read(fd,&edad,2); //si lee 2 asteriscos, toca leer la edad
                cout<<edad; c=0;}
           }
            else if(k=='#') {cout<<endl; band=1; break;}
            else cout<<k;
        }
             if(k=='#')
             cont++;

 }
if(band==0)cout<<"eliminado";
}


/*

ACA la función principal donde esta el menú para elegir las
 diferentes operaciones pronto publicare mas operaciones con RLV

*/
int main(int argc, char *argv[])
{A[0]=-1;
    int op;
    system("color 3f");
    do{
        cout<<endl<<"1.escribir    2.ver  3.buscar    4.eliminar logica  5.promedio  6.salir"<<endl;
        cin>>op;
        switch(op){
                   case 1:    escribir();break;
                   case 2:    ver();break;
                   case 3:    buscar();break;
                   case 4:     eliminacion_logica(); break;
                  /* case 5:      promedio(); break;
               case 6:     ordenacion(); break;
                   case 8:      eliminacion_fisica(); break; */
                   case 9:     break;
                   };
        }while(op!=9);
    system("PAUSE");
    return EXIT_SUCCESS;
}
Siguiente
« Post Anterior