laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 30 May, 2005 11:42 am Asunto: Puntero al prinicipo y duda de ficheros |
|
|
Hola!!
El codigo que viene a continuación lo tengo en un programa que recibe unos datos de un ordenador remoto en un fichero de texto y lo pasa a una tabla SQL.
Tengo un par de dudas.
¿Por que hay que hacer "buffer -= bytes;", es decir, poner al principio el offset del buffer, antes de liberarlo?
¿hace falta liberar la variable *Buffer en la funcion PasarDeBuffer?
¿Se puede hacer esto mismo con menos codigo?¿sin la funcion PasarDeBuffer?.
En otros programas defino un struct, le paso el puntero a fread y ya está pero aqui no puedo hacer eso.
//---------------------------------------------------------------------------
// Pasa de un buffer un número de bytes a una variable char y le pone el 0x00
// El retonar la longitud es para poder sumar el desplazamiento al buffer
// ya que no es el mismo puntero el definido en esta función que el definido en
// la llamada.
//---------------------------------------------------------------------------
int PasarDeBuffer(char *Buffer, char Variable[],int Longitud)
{
for(int a=0; a < Longitud;a++) Variable[a] = *Buffer++;
Variable[Longitud] = 0x00;
return(Longitud);
}
//---------------------------------------------------------------------------
// Lee lo que hay en fichero y lo pasa a SQL
// devuelve: 0 si es correcto
// 1 si el fichero es defectuoso
// 2 si el registro esta ya en la base de datos (duplicado)
// NOTA: No se puede usar un struct porque haría falta que los registros
// vinieran con 0x00 al final. Pero vienen sin él. Es un churro que viene
// con 0x0D y 0x0A y gracias.
//---------------------------------------------------------------------------
int __fastcall ImportarFichero(AnsiString Fichero)
{
int a,Handle,longitud,leidos,bytes;
char *buffer;
int devuelve;
char RT[2],SO[7],AN[21],LN[4],RD[9];
char PC[9],SC[19],S[15],UO[3];
char BE[9],LT[11],PD[9],PT[5];
char CRLF[3];
devuelve = bytes = longitud = leidos = Handle = 0;
Handle = FileOpen(Fichero, fmOpenRead); //se abre solo para leer
longitud = FileSeek(Handle,0,2); //se obtiene la longitud del fichero
FileSeek(Handle,0,0); //se posiciona al principio del fichero
buffer = new char[longitud+1]; //se asigna espacio para leer
leidos = FileRead(Handle, buffer, longitud); //se lee todo siempre
FileClose(Handle); //y se cierra
//ShowMessage("Leidos = "+AnsiString(leidos));
//si el fichero es multiplo de 112 se procesa lo leido sino devuelve un error
if((leidos % 112) == 0)
{
bytes = 0;
while(bytes < leidos)
{
//Se empieza pasando del buffer a las variables
buffer += PasarDeBuffer(buffer,RT,1);
buffer += PasarDeBuffer(buffer,SO,6);
buffer += PasarDeBuffer(buffer,AN,20);
buffer += PasarDeBuffer(buffer,LN,3);
buffer += PasarDeBuffer(buffer,RD,8);
buffer += PasarDeBuffer(buffer,PC,8);
buffer += PasarDeBuffer(buffer,SC,18);
buffer += PasarDeBuffer(buffer,S,14);
buffer += PasarDeBuffer(buffer,UO,2);
buffer += PasarDeBuffer(buffer,BE,8);
buffer += PasarDeBuffer(buffer,LT,10);
buffer += PasarDeBuffer(buffer,PD,8);
buffer += PasarDeBuffer(buffer,PT,4);
buffer += PasarDeBuffer(buffer,CRLF,2); //0x0d y 0x0a
bytes += 112;
//ahora estos datos se pasan a una tabla en SQL SERVER
//...
} //while bytes
//sino se lleva el puntero al principio le da por fallar
buffer -= bytes;
} //si leidos mod 112
else devuelve = 1; //fichero en mal estado
delete [] buffer;
return(devuelve);
}
Bueno, no sé si esto serán majaradas mías, pero se agradecerá mucho una opinión experta.
Saludos... |
|