309 lines
6.9 KiB
C++
309 lines
6.9 KiB
C++
#include "StdAfx.h"
|
||
#include "csv_file.h"
|
||
#include "_error.h"
|
||
//*********************************************************************************************************
|
||
Ccsv_file::Ccsv_file( C_error* err/*=NULL*/ )
|
||
{
|
||
if (err)
|
||
{
|
||
b_er=FALSE;
|
||
er=err;
|
||
}
|
||
else
|
||
{
|
||
er= new C_error();
|
||
b_er=TRUE;
|
||
}
|
||
filas.z=sizeof(Fila_csv_file);
|
||
filas.incremento=100;
|
||
incre_col=100;
|
||
}
|
||
//*********************************************************************************************************
|
||
Ccsv_file::~Ccsv_file(void)
|
||
{
|
||
if(b_er && er)
|
||
delete er;
|
||
borra();
|
||
}
|
||
//*********************************************************************************************************
|
||
Fila_csv_file* Ccsv_file::get_f( int i )
|
||
{
|
||
return (Fila_csv_file*)filas.get(i);
|
||
}
|
||
//*********************************************************************************************************
|
||
char* Ccsv_file::get( int fila,int col )
|
||
{
|
||
Fila_csv_file*f;
|
||
Columna_csv_file *c;
|
||
f=get_f(fila);
|
||
if (!f)
|
||
return NULL;
|
||
c=f->get(col);
|
||
if (!c)
|
||
return NULL;
|
||
return str.get(c->itex);
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::n_col( int fil )
|
||
{
|
||
Fila_csv_file*f;
|
||
f=get_f(fil);
|
||
if (!f)
|
||
return -1;
|
||
return f->colum->n;
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::n()
|
||
{
|
||
return filas.n;
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::add()
|
||
{
|
||
Fila_csv_file*f;
|
||
filas.reserva();
|
||
filas.n++;
|
||
f=get_f(filas.n-1);
|
||
f->inicia(incre_col);
|
||
f->flags=0;
|
||
return filas.n-1;
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::add( int fila, char *valor )
|
||
{
|
||
Fila_csv_file*f;
|
||
Columna_csv_file *c;
|
||
f=get_f(fila);
|
||
if (!f)
|
||
return -1;
|
||
c=f->add_coun();
|
||
str.add(valor);
|
||
c->itex=str.size()-1;
|
||
return f->colum->n-1;
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::add( int fila, int valor )
|
||
{
|
||
char s[64];
|
||
sprintf(s,"%ld",valor);
|
||
return add(fila,s);
|
||
}
|
||
//*********************************************************************************************************
|
||
int Ccsv_file::add( int fila, double valor )
|
||
{
|
||
char s[128];
|
||
sprintf(s,"%ld",valor);
|
||
return add(fila,s);
|
||
}
|
||
//*********************************************************************************************************
|
||
BOOL Ccsv_file::set( int fila, int col, char* value )
|
||
{
|
||
Fila_csv_file*f;
|
||
Columna_csv_file *c;
|
||
f=get_f(fila);
|
||
if (!f)
|
||
return FALSE;
|
||
c= f->get(col);
|
||
if(!c)
|
||
return FALSE;
|
||
c->itex=str.size();
|
||
str.add(value);
|
||
return TRUE;
|
||
}
|
||
//*********************************************************************************************************
|
||
BOOL Ccsv_file::set( int fila, int col, int value )
|
||
{
|
||
char s[64];
|
||
sprintf(s,"%ld",value);
|
||
return set(fila,col,s);
|
||
}
|
||
//*********************************************************************************************************
|
||
BOOL Ccsv_file::set( int fila, int col, double value )
|
||
{
|
||
char s[128];
|
||
sprintf(s,"%ld",value);
|
||
return set(fila,col,s);
|
||
}
|
||
//*********************************************************************************************************
|
||
void Ccsv_file::borra()
|
||
{
|
||
Fila_csv_file*f;
|
||
for(int i=0; i<filas.n;i++)
|
||
{
|
||
f=get_f(i);
|
||
f->del();
|
||
}
|
||
filas.borra();
|
||
}
|
||
//*********************************************************************************************************
|
||
BOOL Ccsv_file::lee( char *path,char separa )
|
||
{
|
||
char *buf=NULL;
|
||
char *s1;
|
||
char *s2;
|
||
char *s3;
|
||
int fi;
|
||
borra();
|
||
HANDLE hfile=INVALID_HANDLE_VALUE;
|
||
DWORD dw,nb;
|
||
//abrimos archivo---------------------
|
||
|
||
hfile = CreateFile(path, GENERIC_READ, 0, NULL,
|
||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||
|
||
if (hfile == INVALID_HANDLE_VALUE)
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
return FALSE;
|
||
}
|
||
|
||
nb=SetFilePointer(hfile,0,NULL,FILE_END);
|
||
if(nb==INVALID_SET_FILE_POINTER)
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
buf=(char *)malloc(nb+2);
|
||
|
||
dw=SetFilePointer(hfile,0,NULL,FILE_BEGIN);
|
||
if(dw==INVALID_SET_FILE_POINTER)
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
if (!ReadFile(hfile, (LPSTR) buf ,nb,&dw,NULL))
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
CloseHandle(hfile);
|
||
hfile=INVALID_HANDLE_VALUE;
|
||
buf[nb]=0;
|
||
buf[nb+1]=0;//aseguramos el final de la cadena;
|
||
s1=buf;
|
||
//procesamos--------------------------------------------------
|
||
while (*s1)
|
||
{
|
||
s2=busca_salto_linea(s1);
|
||
if (*s2)
|
||
{
|
||
*s2=0;
|
||
s2++;
|
||
while(*s2=='\r' ||*s2=='\n')
|
||
s2=s2+1;
|
||
}
|
||
//a<>adimos fila------------------------------------------
|
||
fi=add();
|
||
s3=s1;
|
||
while(*s3)
|
||
{
|
||
if (*s3==separa)
|
||
{
|
||
*s3=0;
|
||
//a<>adimos columna----------------------------------
|
||
add(fi,s1);
|
||
s1=s3+1;
|
||
}
|
||
s3=s3+1;
|
||
}
|
||
s1=s2;
|
||
}
|
||
free(buf);
|
||
return TRUE;
|
||
salgo:
|
||
if (hfile!=INVALID_HANDLE_VALUE)
|
||
CloseHandle(hfile);
|
||
if (buf)
|
||
free(buf);
|
||
return FALSE;
|
||
}
|
||
//*********************************************************************************************************
|
||
BOOL Ccsv_file::guarda( char *path, char separa, BOOL ret_carro )
|
||
{
|
||
HANDLE hfile=INVALID_HANDLE_VALUE;
|
||
DWORD dw;
|
||
char salto='\n';
|
||
char ret_ca='\r';
|
||
Fila_csv_file*f;
|
||
Columna_csv_file *c;
|
||
char*st;
|
||
|
||
/*
|
||
er->pon(MODULO_INI_FILE,"guarda: Funci<63>n no implementada");
|
||
return FALSE;*/
|
||
//abrimos archivo-------------------------------
|
||
hfile=CreateFile(path,
|
||
GENERIC_WRITE,
|
||
0, // exclusive access
|
||
NULL, // no security
|
||
CREATE_ALWAYS,
|
||
0, // no overlapped I/O
|
||
NULL); // null template
|
||
|
||
if (hfile == INVALID_HANDLE_VALUE)
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
return FALSE;
|
||
}
|
||
//guardamos---------------------------------
|
||
for (int i=0; i<filas.n; i++)
|
||
{
|
||
f=get_f(i);
|
||
if (f)
|
||
{
|
||
//guardamos columnas----------------
|
||
for (int j=0; j<f->colum->n;j++)
|
||
{
|
||
c=f->get(j);
|
||
st=str.get(c->itex);
|
||
if (j!=0)
|
||
{
|
||
//ponemos separacion--------
|
||
if(!WriteFile(hfile, &separa, 1, &dw, NULL))
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
}
|
||
if(!WriteFile(hfile, st, sizeof(st), &dw, NULL))
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
}
|
||
if (ret_carro)
|
||
{
|
||
if(!WriteFile(hfile, &ret_ca, 1, &dw, NULL))
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
}
|
||
if(!WriteFile(hfile, &salto, 1, &dw, NULL))
|
||
{
|
||
er->pon_win(MODULO_CSV_FILE);
|
||
goto salgo;
|
||
}
|
||
}
|
||
}
|
||
//cerramos----------------------------------
|
||
if(hfile!=INVALID_HANDLE_VALUE)
|
||
{
|
||
CloseHandle(hfile);
|
||
}
|
||
return TRUE;
|
||
|
||
salgo:
|
||
if(hfile!=INVALID_HANDLE_VALUE)
|
||
CloseHandle(hfile);
|
||
return FALSE;
|
||
}
|
||
//*********************************************************************************************************
|
||
char* Ccsv_file::busca_salto_linea( char* st )
|
||
{
|
||
char *s=st;
|
||
while(*s && *s!='\r' && *s!='\n' )
|
||
s=s+1;
|
||
return s;
|
||
}
|
||
//*************************************************************************************************
|