archivos, registros de longitud fija en c++: operaciones






Habíamos visto la longitud variable que ocupa un espacio según su longitud  o tamaño, pero la longitud fija no cambia ya que mantiene firma los espacios separados cuando se declare en la estructura

La implementación tiene las mismas librerías y también se encuentran la estructura que contiene el archivo con longitud fija ya declarado con números de espacios que va a tomar



#include <iostream>
#include <string.h>
#include <cstdlib>
#include <io.h>/
#include <fcntl.h>
#include <sys\stat.h>
#define DELIM_R "#"
#define DELIM_C "*"
char file[10],c;
int fd,n,pos;

using namespace std;

typedef struct cabeza
{
    int nrs;
}encabezado;
encabezado e;
int le=sizeof(struct cabeza);

typedef struct reg
{
    char nom[10];
    int ptje,nr,estado;

}regdat;

regdat r;
int lr=sizeof(struct reg);

/*
al igual que el de longitud fija escribiendo el nombre del archivo 
tambien su estado es 1, escribiendo el nombre y puntaje

*/
void escribir()
{
    e.nrs=0;
    r.nr=0;
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=creat(file,S_IWRITE|S_IREAD))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    lseek(fd,le,0);
    r.estado=1;
    do
    {
        e.nrs=++r.nr;
        cout<<"Nombre: ";
        cin>>r.nom;
        cout<<"Puntaje: ";
        cin>>r.ptje;
        write(fd,&r,lr);
        cout<<"desea agregar otro registro (s/n): ";
        cin>>c;
    }
    while(c=='s');
    lseek(fd,0,0);
    write(fd,&e,le);
    close(fd);
}

/*
seguimos agregando y no se borra al intentar reescrbir

*/
void agregar()
{
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,O_RDWR))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    read(fd,&e,le);
    lseek(fd,0,2);
    r.nr=e.nrs+1;
    ++e.nrs;
    cout<<"Nombre: ";
    cin>>r.nom;
    cout<<"Puntaje: ";
    cin>>r.ptje;
    r.estado=1;
    write(fd,&r,lr);
    lseek(fd,0,0);
    write(fd,&e,le);
    close(fd);
}

/*
Se elimina logicamente (cambiar r.estado a 0) segun el archivo elegido
*/
void elim_nom()
{
    char name[10];
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,2))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    read(fd,&e,le);
    cout<<"ingrese nombre ";
    cin>>name;
    n=0;
    while(read(fd,&r,lr)>0)
    {
        ++n;

        if(strcmp(r.nom,name)==0)
        {

            pos=(n-1)*lr+le;

                        r.estado=0;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);

        }

    }
close(fd);
}

//hacemos que todos los archivos tengan estado 1
void retaurar_todo()
{
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,2))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    read(fd,&e,le);
    n=0;
    while(read(fd,&r,lr)>0)
    {
        ++n;
        if(r.estado==0)
        {
                pos=(n-1)*lr+le;
                r.estado=1;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);
        }
    }
    close(fd);
}

/*
aca elimina por puntaje, lo busca y luego su estado cambia a 0
*/
void elim_ptje()
{
    int je;
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,2))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    cout<<"ingrese ptje ";
    cin>>je;
    n=0;
    read(fd,&e,le);
    while(read(fd,&r,lr)>0)
    {
        ++n;
        if(r.ptje==je)
        {

            pos=(n-1)*lr+le;

                        r.estado=0;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);

        }

    }
close(fd);
}

/*
identifica la posicion  luego lo reemplaza modificando
el archivo
*/
void actualizar()
{
    int option=0;
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,2))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    cout<<"Ingrese N° de registro: ";
    cin>>n;
    read(fd,&e,le);
    if(n<=e.nrs)
    {
        cout<<"Que desea actualizar";
        cout<<"\n 1.- Nombre"<<endl;
        cout<<"\n 2.- Puntaje"<<endl;
        cout<<"\n 3.- Eliminar registro"<<endl;
        cout<<"\n 4.- Recuperar registro"<<endl;
        cout<<"\n 5.- Cancelar"<<endl;
        cin>>option;
        switch(option)
        {
            case(1):{
                        pos=(n-1)*lr+le;
                        lseek(fd,pos,0);
                        read(fd,&r,lr);
                        cin>>r.nom;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);
                        close(fd);
                    }
                    break;
            case(2):{
                        pos=(n-1)*lr+le;
                        lseek(fd,pos,0);
                        read(fd,&r,lr);
                        cin>>r.ptje;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);
                        close(fd);
                    }
                    break;
            case(3):{
                        pos=(n-1)*lr+le;
                        lseek(fd,pos,0);
                        read(fd,&r,lr);
                        r.estado=0;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);
                        close(fd);
                    }
                    break;
            case(4):{
                        pos=(n-1)*lr+le;
                        lseek(fd,pos,0);
                        read(fd,&r,lr);
                        r.estado=1;
                        lseek(fd,pos,0);
                        write(fd,&r,lr);
                        close(fd);
                    }
                    break;


         }

    }
    else
        cout<<"Fuera de rango";
    close(fd);
}

/*
lo busca y muestra solo un registro
*/
void leer_regn()
{
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,O_TEXT))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    cout<<"Ingrese numero de registro: ";
    cin>>n;
    pos=(n-1)*lr+le;
    lseek(fd,pos,0);
    read(fd,&r,lr);
    cout<<r.nom<<" "<<r.ptje;
    close(fd);
}

void leer_todo()
{
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,O_TEXT))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    read(fd,&e,le);
    lseek(fd,le,0);
    int i;
    for(i=1;i<=e.nrs;i++)
    {
        read(fd,&r,lr);
        if(r.estado!=0)
            cout<<r.nom<<" "<<r.ptje<<endl;

    }
    close(fd);
}

/*
muestra la cantidad de registros que tiene el archivo
*/
void nro_reg()
{
    cout<<"Ingrese nombre del archivo: ";
    cin>>file;
    if((fd=open(file,O_TEXT))<0)
    {
        cout<<"\x07 NO SE PUDO CREAR EL ARCHIVO "<<file<<endl;
        return;
    }
    read(fd,&e,le);
    cout<<e.nrs;
    close(fd);
}


int main()
{
    int res=0;
    char a[1];
    do
    {
        cout<<"\n \t MENU:"<<endl;
        cout<<"\n 1.- Crear un archivo nuevo"<<endl;
        cout<<"\n 2.- Agregar"<<endl;
        cout<<"\n 3.- Datos del reg n-esimo"<<endl;
        cout<<"\n 4.- Numero de registros"<<endl;
        cout<<"\n 5.- Leer todo"<<endl;
        cout<<"\n 6.- Actualizar"<<endl;
        cout<<"\n 7.- Eliminar por nombre"<<endl;
        cout<<"\n 8.- Eliminar por puntraje"<<endl;
        cout<<"\n 9.- restaurar todo"<<endl;
        cin>>res;
        switch(res)
        {
            case(1):{
                        escribir();
                    }
                    break;
            case(2):{
                        agregar();
                    }
                    break;
            case(3):{
                        leer_regn();
                    }
                    break;
            case(4):{
                        nro_reg();
                    }
                    break;
            case(5):{
                        leer_todo();
                    }
                    break;
            case(6):{
                        actualizar();
                    }
                    break;
            case(7):{
                        elim_nom();
                    }
                    break;
            case(8):{
                        elim_ptje();
                    }
                    break;
                case(9):{
                        retaurar_todo();
                    }
                    break;
         }
    }
    while(res<10);

 return 0;
 //system("PAUSE");
 //return EXIT_SUCCESS;

}
Siguiente
« Post Anterior