#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; idel(); } 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ó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; icolum->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; } //*************************************************************************************************