Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Guardar un float en disco

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Guardar un float en disco Responder citando

Hola amigos
Tengo el siguiente problema, estoy recibiendo en un AnsiString varios datos de una terminal, entre estos datos la temperatura, yo tengo la temperatura, se donde viene en el String y la he "procesado" de la siguiente forma:
temperatura = AnsiString::IntToHex(buffer,2)/2.0;
Esto me da el resultado correcto ej. 15,5 o 32,5 etc. Pero lo que no logro resolver es como guardar esto datos en disco. Estoy dandole forma a un archivo csv para poder leerlo con Excel, todo esto ya está resuelto lo que no logro hacer es guardar el float para verlo en Excel correctamente es decir que se lea en la celda 18,5. Los demas datos los guardo de la siguiente forma y funciona sin problemas:
.......................
{
if((buffer == '/') || (buffer == ';') || (buffer == 0x0D)){
fwrite(&Datos_RX[n],sizeof(Datos_RX[n]),1,fPtr);
}
else{
ajustar= ((buffer >> 4) & 0x0F) +0x30;
fwrite(&ajustar,sizeof(ajustar),1,fPtr);
ajustar= (buffer &0x0F) +0x30;
fwrite(&ajustar,sizeof(ajustar),1,fPtr);
vector++;
}
}
}
salvar-> Enabled = false;
..............................................................
Agradecería cualquier orientación o comentario sobre esto.
Desde ya muchas gracias.

Angel Molina.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

prueba con la misma variable de la siguiente manera

Código:
Temperatura.ToDouble();


Editado:
Ok al contestar vi tu respuesta y vi parte de tu codigo, pero la imaginacion me ha traicionado, es correcto lo que mencionas y la unica manera que creo o considero que debes guardarlo dentro de tu archivo CVS (archivo de texto separado por comas) supongamos lo siguiente
Tienes esta información
"Una cadena de caracteres" - 123 - 45,67
los datos son: una cadena, un entero y un float, al guardar en tu archivo CVS los datos quedan de la siguiente manera

"Una cadena de caracteres",123,45,67

El error esta en el campo float como bien estas comentando pues en lugar de tener 3 datos obientes 4 ya que la coma, es el separador del Archivo CVS, una de las maneras que se me ocurre

Es grabar el último dato como una cadena de caraceres

"Una cadena de caracteres",123,"45,67"

y formatear tus columnas de Excel para que acepten solo numeros, ya que al pasar los datos del archivo CVS solo obtendrás los 3 datos y no los cuatro como se te esta mostrando.

Otra de las opciones un poco mas profesional es pasar directamente la información al archivo de excel y no usar un archivo CVS como "puente"
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Jue 13 Ago, 2009 5:01 am, editado 2 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Por la forma en que guardas, deduzco que buffer y ajustar son del tipo BYTE
Temperatura es un float y por lo tanto mas largo 32 bits frente a los 8 del BYTE. No puedes usar la misma forma de guardar en disco. Usa la propia:

Para guardarlo tal cual:
Código:
float Temp;
.....
fwrite(&Temp, sizeof(float), 1, fPtr);
.....


Para guardarlo como texto:
Código:
float Temp;
.....
char Buff[256];
sprintf(Buff, "%f", Temp);
fwrite(Buff,  strlen(Buff), 1, fPtr);
.....

// O bien:
AnsiString Temperatura(Temp);
fwrite(Temperatura.c_str(), Temperatura.Length(), 1, fPtr); 
......


Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Perfecto!!! Responder citando

Perfecto!!!
---------------------------------------------
char Buff[256];
sprintf(Buff, "%f", Temp);
fwrite(Buff, strlen(Buff), 1, fPtr);
.........................................................
Esto resuelve el problema, solo me falta acotar la cantidad de decimales.
La verdad me tenia enredado este asunto de poder guardar el float en el disco.
Desde ya MUCHAS GRACIAS!!!!! y mis disculpas por la basico de mis consultas.

Saludos para todos.

Angel Molina
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:
sprintf(Buff, "%7.2f", Temp);

_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Solucionado!! Responder citando

Hola gente amiga.
Primero muchas gracias por el tiempo prestado aportando ideas.
esto funciona perfectamente y resuelve el dilema:
------------------------------------------------------------
char Buff[5];
float temperatura;
byte buffer,contador;
--------------------
for(int n = 1; n <= Datos_RX.Length(); n++)
{
contador++;
buffer =Datos_RX[n];
if(contador == 11){ // Lugar de la temperatura
temperatura = buffer /2.0;
sprintf(Buff,"%7.1f", temperatura); // Acota los decimales
fwrite(Buff,strlen(Buff), 1, fPtr);
contador = 0;
}
---------------------------------------------------------------------
El tema venia porque tengo un viejo Data Logger que toma datos de temperatura cada hora y lo guarda en una memoria, almacenando fecha, hora y temperatura, el soft original estaba para DOS y el fabricante ya no existe mas y se me ocurrió reflotarlo y usarlo con los sistemas actuales por USB.
Para esto y con la ayuda de un PIC18F2550 conectado como puente entre el Data Logger y la PC he resuelto el problema, ahora el Data Logger "habla" con el pic y este mediante USB modo CDC con el programa en Builder C++ .

Simplemente gracias por los aportes!!!!
Cordiales saludos para todos.

Angel Molina
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.