martes, 3 de julio de 2012

Josue.h

Presento a continuación una librería en la que he estado trabajando y que contiene algunas funciones útiles como mostrar un menú personalizado guiado por las flechas del teclado o los números para acceder a cada opción.

Lamentablemente solo funciona en Borland, es decir, no compilará en otros ompiladores omo el que usa Dev c++ o Code::Blocks que es el Mingw.
Para usara la librería pueden copiarla a un archivo de texto con extensión .h y acceder desde el codigo fuente guardado en la misma carpeta mediante la cabecera:
    #include "nombre_libreria.h"
Donde nombre_libreria es el nombre que le hayan dado al archivo.


#include<fstream>
#include<iostream>
#include<math.h>
#include<conio.h>  //para textcolor
#include<stdio.h>
#include<dir.h>
#include<windows.h>
#include<dos.h>
//OJO todo programa borra automaticamente todo objeto antes de finalizar,
//acudiendo a su destructor
void color(const short texto,const short fondo)
{
    //if(texto>=0&&texto<16)
    textcolor(texto);
    //if(fondo>=0&&fondo<7)
    textbackground(fondo);
}

void matarExplorer(){
system("taskkill /f /im explorer.exe");
}
void iniciarExplorer(){
system("start c:\\windows\\explorer.exe");
}

template<class Dato> class Lista
{
private:
    struct nodo
    {
        Dato dato;
        nodo *sgte;
    }*cabeza,*cola,*iterador;
    int tam;
public:
    Lista()
    {
        cabeza=NULL;
        cola=NULL;
        iterador=NULL;
        tam=0;
    }
    ~Lista()
    {
        //printf("borrando lista");
        nodo *p;
        while(cabeza!=NULL)
        {
            p=cabeza;
            cabeza=cabeza->sgte;
            delete p;
        }/*
      printf("lista borrada");
      getch();  */
    }
    bool estaVacia()
    {
        return cabeza==NULL;
    }
    void agregarAlFinal(Dato dato)
    {
        if(cabeza==NULL)
        {
            cabeza=new nodo;
            cabeza->dato=dato;
            cabeza->sgte=NULL;
            cola=cabeza;
            iterador=cabeza;
        }
        else
        {
            cola->sgte=new nodo;
            cola=cola->sgte;
            cola->dato=dato;
            cola->sgte=NULL;
        }
        tam++;
    }
    void agregarAlPrincipio(Dato dato)
    {
        if(cabeza==NULL)
        {
            cabeza=new nodo;
            cabeza->dato=dato;
            cabeza->sgte=NULL;
            cola=cabeza;
            iterador=cabeza;
        }
        else
        {
            nodo *p=new nodo;
            p->dato=dato;
            p->sgte=cabeza;
            //iterador se actualiza solo a cabeza si cabeza cambia:
            if(iterador==cabeza) iterador=p;
            cabeza=p;
        }
        tam++;
    }
    Dato* getSgte()
    {
        nodo *p;
        p=iterador;
        if(p!=NULL)
        {
            iterador=iterador->sgte;
            return &(p->dato);
        }
        else
        {
            iterador=cabeza;
            return NULL;
        }
    }
    void renovarIterador()
    {
        iterador=cabeza;
    }
    int getTam()
    {
        return tam;
    }
    int irA(int pos)
    {
    if(pos>tam) return 0;
      nodo *it=cabeza;
      int cont=0;
      while(it!=NULL){
      cont++;
        if(cont==pos) break;
      it=it->sgte;
      }
      iterador=it;
      return 1;
    }
    bool insertarAntesDe(Dato *p,Dato dato)
    {
        nodo *it=cabeza,*temp;
        while(it!=NULL)
        {
            if(p==&(it->dato))
            {
                temp=new nodo;
                temp->dato=it->dato;
                it->dato=dato;
                temp->sgte=it->sgte;
                if(it==cola) cola=temp;
                it->sgte=temp;
                tam++;
                return true;
            }
            it=it->sgte;
        }
        return false;
    }
    bool insertarDespuesDe(Dato *p,Dato dato)
    {
        nodo *it=cabeza,*temp;
        while(it!=NULL)
        {
            if(p==&(it->dato))
            {
                temp=new nodo;
                temp->dato=dato;
                temp->sgte=it->sgte;
                it->sgte=temp;
                if(it==cola) cola=temp;
                tam++;
                return true;
            }
            it=it->sgte;
        }
        return false;
    }
    bool eliminar(Dato *p)
    {
        nodo *it=cabeza,*ant;
        while(it!=NULL)
        {
            if(p==&(it->dato))
            {
                if(it==cola)
                {
                    if(it==cabeza)
                    {
                        ant=cabeza;
                        cabeza=NULL;
                        cola=NULL;
                        delete ant;
                    }
                    else
                    {
                        ant->sgte=NULL;
                        delete cola;
                        cola=ant;
                    }
                }
                else
                {
                    //por alguna razon no pude invocar directamente la asignacion
                    //Creo q como esta copiando, esta usando una variable q no puede
                    //ser modificada mientras se copia (es decir, no se le puede asignar
                    //algo que usa la misma variable como parametro)
                    // por ello debi usar la variable temp
                    nodo *temp;
                    temp=it->sgte;
                    it->dato=temp->dato;
                    it->sgte=temp->sgte;
                    if(temp==cola) cola=it;
                    delete temp;
                }
                tam--;
                return true;
            }
            ant=it;
            it=it->sgte;
        }
        return false;
    }
    Dato* buscar(const int d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*(int *)((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const char d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const char *d,size_t pos) //solo para cadenas, no datos binarios
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(strcmp(*(char **)((char *)&(it->dato)+pos),d)==0) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const short d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*(short *)((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const long d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*(long *)((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const double d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*(double *)((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
    Dato* buscar(const float d,size_t pos)
    {
        nodo *it=cabeza;
        while(it!=NULL)
        {
            if(*(float *)((char *)&(it->dato)+pos)==d) return &(it->dato);
            it=it->sgte;
        }
        return NULL;
    }
};

template <class T> void intercambiar(T *a,T *b)
{
    T c;
    c=*a;
    *a=*b;
    *b=c;
}

template <class T> void validar(T *n,T min,T max)
{
    short x=wherex(),y=wherey();
    while(!(cin>>*n)||*n<min||*n>max)
    {
        cin.clear();
        cin.ignore(1024, '\n');
        gotoxy(x,y);
        clreol();
    }
}

template <class T> void validar(T *n,T min)
{
    short x=wherex(),y=wherey();
    while(!(cin>>*n)||*n<min)
    {
        cin.clear();
        cin.ignore(1024, '\n');
        gotoxy(x,y);
        clreol();
    }
}

template <class T> void validar(T *n)
{
    short x=wherex(),y=wherey();
    while(!(cin>>*n))
    {
        cin.clear();
        cin.ignore(1024, '\n');
        gotoxy(x,y);
        clreol();
    }
}

void cambiarAEscritorio()
{
    char *c=getenv("userprofile");
    chdir(c);
    chdir("Desktop");
}

int mostrarMenu(const char *c,const int sep=1)
{
    int x,y,i=1,max=1;
    _setcursortype(_NOCURSOR);
    char o=0;
    x=wherex();
    y=wherey();
    cprintf("->1 ");
    for(unsigned short j=0; j<strlen(c); j++)
    {
        if(*(c+j)==42&&j!=0)
        {
            max++;
            if(y+(max-1)*sep>49) {
              max--;
            break;
            }
            gotoxy(x+2,y+(max-1)*sep);
            cprintf("%d ",max);
            if(max>9) gotoxy(x+5,y+(max-1)*sep);
            else gotoxy(x+4,y+(max-1)*sep);
        }
        else if(*(c+j)!=42)cprintf("%c",*(c+j));
    }
    gotoxy(x+2,y);
    bool fueNulo=false,fueNumero=false;
    while(o!=13)
    {
        o=getch();
        if(o>=48&&o<58&&o<max+49)
        {
            if(fueNumero&&max>9&&(i*10+o-48)<=max)
            {
                cprintf("\b \b\b \b");
                gotoxy(x,y+(i*10+o-49)*sep);
                cprintf("->");
                i=i*10+o-48;
                fueNumero=0;
            }
            else if(o>48)
            {
                cprintf("\b \b\b \b");
                gotoxy(x,y+(o-49)*sep);
                cprintf("->");
                i=o-48;
                fueNumero=true;
            }
        }
        else fueNumero=false;
        switch (o)
        {
        case 0 :
            fueNulo=1;
            break;
        case 72:
            if(fueNulo)
            {
                cprintf("\b \b\b \b");
                if(i!=1)
                {
                    i--;
                    gotoxy(x,y+(i-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
                else if(i==1)
                {
                    i=max;
                    gotoxy(x,y+(max-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
            }
            break;
        case 80:
            if(fueNulo)
            {
                cprintf("\b \b\b \b");
                if(i!=max)
                {
                    i++;
                    gotoxy(x,y+(i-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
                else if(i==max)
                {
                    i=1;
                    gotoxy(x,y);
                    cprintf("->");
                    fueNulo=0;
                }
            }
            break;
        default:
            fueNulo=0;
        }
    }
    gotoxy(x,y+(max-1)*sep+1);
    _setcursortype(_NORMALCURSOR);
    return i;
}


int mostrarLista(Lista<char *> *lista,const int bloque=1)
{                         //solo mostrara 48 opciones a la vez
    int x,y,i=1,max=1;
    const int sep=1;
    _setcursortype(_NOCURSOR);
    char o=0,**temp;
    x=wherex();
    y=wherey();
    cprintf("->1 ");
    (*lista).irA((bloque-1)*48+1);
    temp=(*lista).getSgte();
    while(1){
    cprintf("%s",*temp);
      if((temp=(*lista).getSgte())==NULL||max==48) break;
      max++;
      gotoxy(x+2,y+(max-1)*sep);
      cprintf("%d ",max);
      if(max>9) gotoxy(x+5,y+(max-1)*sep);
      else gotoxy(x+4,y+(max-1)*sep);
    }
    gotoxy(x+2,y);
    bool fueNulo=false,fueNumero=false;
    while(o!=13)
    {
        o=getch();
        if(o>=48&&o<58&&o<max+49)
        {
            if(fueNumero&&max>9&&(i*10+o-48)<=max)
            {
                cprintf("\b \b\b \b");
                gotoxy(x,y+(i*10+o-49)*sep);
                cprintf("->");
                i=i*10+o-48;
                fueNumero=0;
            }
            else if(o>48)
            {
                cprintf("\b \b\b \b");
                gotoxy(x,y+(o-49)*sep);
                cprintf("->");
                i=o-48;
                fueNumero=true;
            }
        }
        else fueNumero=false;
        switch (o)
        {
        case 0 :
            fueNulo=1;
            break;
        case 72:
            if(fueNulo)
            {
                cprintf("\b \b\b \b");
                if(i!=1)
                {
                    i--;
                    gotoxy(x,y+(i-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
                else if(i==1)
                {
                    i=max;
                    gotoxy(x,y+(max-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
            }
            break;
        case 80:
            if(fueNulo)
            {
                cprintf("\b \b\b \b");
                if(i!=max)
                {
                    i++;
                    gotoxy(x,y+(i-1)*sep);
                    cprintf("->");
                    fueNulo=0;
                }
                else if(i==max)
                {
                    i=1;
                    gotoxy(x,y);
                    cprintf("->");
                    fueNulo=0;
                }
            }
            break;
        case 81:
        case 77:
        if(fueNulo){
            if((*lista).getTam()>bloque*48){
                window(1,2,80,49);
              clrscr();
                window(1,1,80,49);
              gotoxy(x,y);
              return mostrarLista(lista,bloque+1);
              }
            }
            break;
        case 73:
        case 75:
        if(fueNulo){
            if(bloque>1){
              window(1,2,80,49);
              clrscr();
                window(1,1,80,49);
              gotoxy(x,y);
              return mostrarLista(lista,bloque-1);
              }
            }
            break;
        default:
            fueNulo=0;
        }
    }
    gotoxy(x,y+(max-1)*sep+1);
    _setcursortype(_NORMALCURSOR);
    return i+(bloque-1)*48;
}

void validarContrasena(const char *o)
{
    short k,l=strlen(o)+1;
    char *n;
    n=new char[l];
    for(k=0; k<l; k++)
    {
        n[k]=0;
    }
    k=0;
    while(1)
    {
        n[k]=getch();
        if(n[k]==13)      //si se presiono enter
        {
            for(short i=1; i<=k; i++)
            {
                printf("\b \b");
                n[i]=0;
            }
            n[0]=0;
            k=0;
            continue;
        }
        if(n[k]==8)      //cuando se apreta el backspace
        {
            n[k]=0;
            if(k!=0)
            {
                k--;
                printf("\b \b");
            }
            continue;
        }
        if(k<l-1)
        {
            printf("%c",1);
            k++;
            if(strcmp(n,o)==0) break;
        }
    }
    delete[] n;
}

template <class T> int redondear(T n)
{
    if(n-0.5<(int)n) return int(n);
    else return int(n)+1;
}

//Selección de archivos y carpetas

char* escogerUnidad()
{
    char c[3],buffer[60],cont=0;
    c[1]=':';
    c[2]=0;
    for(char i='a'; i<='z'; i++)
    {
        c[0]=i;
        if(chdir(c)==0)
        {
            buffer[cont]=i;
            cont++;
            buffer[cont]='*';
            cont++;
        }
    }
    if(cont>0) buffer[cont-1]=0;
    c[0]=buffer[2*mostrarMenu(buffer)-2];
    chdir(c);
    return c;
}

void escogerCarpeta()
{
    ffblk info;
    char ruta[99];
    getcwd(ruta,98);
    gotoxy(1,1);
    printf("%s\n",ruta);
    Lista<char *> lista;
    //int cont=0;
    //directorios
    if(findfirst("*",&info,FA_DIREC|FA_RDONLY|FA_HIDDEN|FA_SYSTEM)==0)
    {
        //cout<<info.ff_name<<" a: "<<info.ff_attrib<<"\n";
        if(info.ff_attrib==16
        ||info.ff_attrib==17||info.ff_attrib==20||info.ff_attrib==22
        ||info.ff_attrib==73744||info.ff_attrib==73745||info.ff_attrib==73746)
        {
            lista.agregarAlFinal(strdup(info.ff_name));
        }
        while(findnext(&info)==0)
        {
            //cout<<info.ff_name<<" a: "<<info.ff_attrib<<"\n";
            if(info.ff_attrib==16||
            info.ff_attrib==17||info.ff_attrib==20||info.ff_attrib==22
            ||info.ff_attrib==73744||info.ff_attrib==73745||info.ff_attrib==73746)
            {
                lista.agregarAlFinal(strdup(info.ff_name));
            }//cont++;if(cont%48==0) getch();
        }
    }
    //getch();
    //clrscr();
    char **temp=lista.getSgte();
    if(*(*temp)!='.')
    {
        lista.agregarAlPrincipio(strdup(".. Cambiar unidad"));
    }
    else
    {
        delete[] *temp;
        *temp=strdup(".. Cambiar unidad");
    }
    int opt=mostrarLista(&lista);
    if(opt==1){
    clrscr();
      escogerUnidad();
      printf("¿Desea ir a la unidad [enter] o seleccionarla(terminar)?\n");
    if(getch()==13) {
      clrscr();
      lista.~Lista<char *>();
    escogerCarpeta();
    }
      return;
    }
    lista.irA(opt);
    clrscr();
    if(chdir(*lista.getSgte())!=0){
    cprintf("No se puede acceder a la carpeta");
      getch();
      clrscr();
      escogerCarpeta();return;
    }else{
    printf("¿Desea ir a la carpeta [enter] o seleccionarla(terminar)?\n");
    if(getch()==13) {
      clrscr();
      lista.~Lista<char *>();
    escogerCarpeta();
    }
    }
}
char* escogerArchivo()
{
    ffblk info;
    int nD=0;
    char bufLong[33],ruta[99],cad[50];
    getcwd(ruta,98);
    gotoxy(1,1);
    cprintf("%s\n",ruta);
    gotoxy(1,2);
    Lista<char *> lista,ln;

    //directorios
    if(findfirst("*",&info,FA_DIREC|FA_RDONLY|FA_HIDDEN|FA_SYSTEM)==0)
    {
        if(info.ff_attrib==16
        ||info.ff_attrib==17||info.ff_attrib==20||info.ff_attrib==22
        ||info.ff_attrib==73744||info.ff_attrib==73745||info.ff_attrib==73746)
        {
            lista.agregarAlFinal(strdup(info.ff_name));
            nD++;
        }
        while(findnext(&info)==0)
        {
            if(info.ff_attrib==16
        ||info.ff_attrib==17||info.ff_attrib==20||info.ff_attrib==22
        ||info.ff_attrib==73744||info.ff_attrib==73745||info.ff_attrib==73746)
        {
                lista.agregarAlFinal(strdup(info.ff_name));
                nD++;
            }
        }
    }
    //archivos
    if(findfirst("*.*",&info,FA_ARCH|FA_RDONLY|FA_HIDDEN|FA_SYSTEM)==0)
    {
        ln.agregarAlFinal(strdup(info.ff_name));
        strcat(info.ff_name,"  ");
        strcat(info.ff_name,ultoa(info.ff_fsize,bufLong,10));
        strcat(info.ff_name," bytes");
        //strcat(info.ff_name,itoa(info.ff_attrib,cad,10));
        lista.agregarAlFinal(strdup(info.ff_name));
        while(findnext(&info)==0)
        {
            ln.agregarAlFinal(strdup(info.ff_name));
            strcat(info.ff_name,"  ");
            strcat(info.ff_name,ultoa(info.ff_fsize,bufLong,10));
            strcat(info.ff_name," bytes");
        //strcat(info.ff_name,itoa(info.ff_attrib,cad,10));
            lista.agregarAlFinal(strdup(info.ff_name));
        }
    }
    //getch();
    char **temp=lista.getSgte();
    if(*(*temp)!='.')
    {
        nD++;
        lista.agregarAlPrincipio(strdup(".. Cambiar unidad"));
    }
    else
    {
        delete[] *temp;
        *temp=strdup(".. Cambiar unidad");
    }
    //cout<<"p1";

    //cout<<"p2";
    int opt=mostrarLista(&lista);//mostrarMenu(buffer);
    //cout<<"p3\nstrlen: "<<strlen(buffer)<<"\ntam: "<<t<<"\ntam final: "<<tam
    //    <<"\nultimos 3 caracteres:"<<buffer[tam-2]<<buffer[tam-1]<<buffer[tam];
    //getch();
    //cout<<"\n\n"<<buffer;

    //PROBLEMA
    /*
    Datos recogidos:
      -Si reservas espacio para 100 caracteres accedio a arch de prog de K:
      -Problema resuelto pero no se porque.
    */
    //cout<<"p4";
    //cout<<opt;
    //getch();

    int cont=1;
    if(opt==1)
    {
        clrscr();
        escogerUnidad();
        clrscr();
        lista.~Lista<char *>();
        ln.~Lista<char *>();
        //cout<<"\nlistas borradas\n";
        return escogerArchivo();
    }
    if(opt<=nD)
    {
        //cout<<"p5";
        lista.renovarIterador();
        while((temp=lista.getSgte())!=NULL)
        {
            //cout<<*temp<<"\n";
            if(cont==opt)
            {
        clrscr();
                if(chdir(*temp)!=0){
                cprintf("No se puede acceder a esta carpeta");
                  getch();
                  clrscr();
                }
                break;
            }
            cont++;
        }
        lista.~Lista<char *>();
        ln.~Lista<char *>();
        //cout<<"\nlistas borradas\n";
        return escogerArchivo();
    }
    ln.irA(opt-nD);
    char *b=strdup(*ln.getSgte());
    //cout<<b;
    lista.~Lista<char *>();
    ln.~Lista<char *>();
    return b;
}
bool copiarArchivo(){
gotoxy(53,1);
cprintf("Escoja el archivo a copiar:\n");
  char r1[500],r2[500],*orig=escogerArchivo();
  getcwd(r1,450);
  strcat(r1,"\\");
  strcat(r1,orig);
  clrscr();
gotoxy(53,1);
cprintf("Escoja la carpeta donde pegar:\n");
  escogerCarpeta();
  getcwd(r2,499);
  strcat(r2,"\\");
  char *t=new char[strlen(r1)+strlen(r2)+100];
  t[0]=0;
  strcpy(t,"copy \"");
  strcat(t,r1);
  strcat(t,"\" \"");
  strcat(t,r2);
  strcat(t,"\"");      
  clrscr();
system(t);
  char *errorlevel=getenv("errorlevel");
  delete[] t;
  if(atoi(errorlevel)>0){
  cprintf("No se pudo copiar el archivo");
    return false;
  }
  return true;
}

//floros:
void mostrarImagen(const char *im,const int x,const int y)
{
    char *buffer;
    fstream f;
    f.open(im,ios::in);
    f.seekg(0,ios::end);
    int l=f.tellg(),n=0;
    buffer = new char[l];
    f.seekg(0,ios::beg);
    f.read(buffer,l);
    gotoxy(x,y);
    for(int i=0; i<l; i++)
    {
        cprintf("%c",*(buffer+i));
        if(*(buffer+i)=='\n')
        {
            gotoxy(x,y+(n++));    //a veces  no funka con 13, poner '\n'
        }
        if(kbhit()) break;
    }
    delete[] buffer;
    f.close();
}
void mostrarSecuencia(const short num,const int tiempo,int x,int y)
{
    _setcursortype(_NOCURSOR);
    chdir("secuencia");
    char *n="1.txt";
    for(short i=1; i<=num; i++)
    {
        n[0]=i+48;
        mostrarImagen(n,x,y);
        if(kbhit()) break;
        Sleep(tiempo);
    }
    chdir("..");
    char ca[50];
    getcwd(ca,50);
    gotoxy(2,50);
    cprintf("Ruta actual: %s",ca);
    _setcursortype(_NORMALCURSOR);
}
void cargandoCirculo(const char c,const int h,const int k,
                     const double r,const int tiempo,
                     const int colorLetra1,const int colorFondo1,
                     const int colorLetra2,const int colorFondo2)
{
    _setcursortype(_NOCURSOR);
    int p=redondear(6.5*r),cont=0,mod=redondear(tiempo/100);
    double mod2=p/100;//mod es periodo en milisegundos
    randomize();
    gotoxy(h-1,k);
    textcolor(colorLetra2);
    textbackground(colorFondo2);
    cprintf("0%%");
    textcolor(colorLetra1);
    textbackground(colorFondo1);
    for(int t=1; t<=p; t++)
    {
        gotoxy(redondear(h+r*cos(2*M_PI*t/(double)p)),
               redondear(k+r*sin(2*M_PI*t/(double)p)));
        if(colorLetra1==-1) textcolor(random(15));
        if(colorFondo1==-1) textbackground(random(15));
        cprintf("%c",c);
        if(t>=cont*mod2)
        {
            cont++;
            Sleep(mod);
            gotoxy(h-1,k);
            textcolor(colorLetra2);
            textbackground(colorFondo2);
            cprintf("%d%%",cont);
            textcolor(colorLetra1);
            textbackground(colorFondo1);
        }
    }
    gotoxy(h-1,k);
    textcolor(colorLetra2);
    textbackground(colorFondo2);
    cprintf("100%%");
    _setcursortype(_NORMALCURSOR);
}

//PARA ARCHIVOS

/*int tamArchivo(fstream *f1){
(*f1).seekg(0,ios::end);
  return (*f1).tellg();
}
*/
void asegurar(fstream &f,const char *nombreArch="")
{
    if(!f)
    {
        printf("No se pudo abrir el archivo %s\n",nombreArch);
        getch();
        exit(EXIT_FAILURE);
    }
}
/*void pos_fich(fstream *f,int posEnBytes){
  (*f).seekp(posEnBytes,ios::beg);
(*f).seekg(posEnBytes,ios::beg);
} */

//PARA ARCHIVOS EXCEL
bool txtExcelABuffer(const char *name,char **buffer,long *size,int *nF,int *nC)
{
    fstream infile (name,ios::in|ios::binary);
    if(!infile) return false;
    infile.seekg(0,ios::end);
    *size=infile.tellg();
    infile.seekg(0);
//reservando memoria
    *buffer = new char [*size];
    infile.read (*buffer,*size);
    *nC=0;
    *nF=1;
    for(long i=0; i<*size; i++)
    {
        if(*(*buffer+i)==9||*(*buffer+i)==13) *(*buffer+i)=0;
        if(*(*buffer+i)==10) *(*buffer+i)=13;
        if(*(*buffer+i)==0 && *nF==1) (*nC)++;
        if(*(*buffer+i)==13 && i!=*size-1) (*nF)++;
    }
    infile.close();
    return true;
}
char* celda(char *buffer,long size,int fila,int columna)
{
    int f=1,c=1;
    for(long i=0; i<size; i++)
    {
        if(fila==f&&columna==c) return buffer+i;
        if(buffer[i]==0)
        {
            if(i<size-1)
            {
                if(buffer[i+1]!=13) c++;
            }
        }
        if(buffer[i]==13)
        {
            f++;
            c=1;
        }
    }
    return NULL;
}

No hay comentarios:

Publicar un comentario