 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
sibilino09 Cdt

Registrado: 05 Mar 2009Mensajes: 8
|
Publicado: Mie 12 Ago, 2009 12:01 am Asunto: Guardar un float en disco |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 12 Ago, 2009 7:01 am Asunto: |
|
|
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" _________________

Ultima edición por Cesar C. Salazar Gonzalez el Jue 13 Ago, 2009 5:01 am, editado 2 veces |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mie 12 Ago, 2009 11:43 pm Asunto: |
|
|
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 |
|
 |
sibilino09 Cdt

Registrado: 05 Mar 2009Mensajes: 8
|
Publicado: Jue 13 Ago, 2009 11:50 pm Asunto: Perfecto!!! |
|
|
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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 14 Ago, 2009 6:23 am Asunto: |
|
|
| Código: | sprintf(Buff, "%7.2f", Temp); |
_________________
 |
|
| Volver arriba |
|
 |
sibilino09 Cdt

Registrado: 05 Mar 2009Mensajes: 8
|
Publicado: Vie 14 Ago, 2009 7:36 pm Asunto: Solucionado!! |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|