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