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 

analissis
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: analissis Responder citando

Hola a todos...

Estoy tratando de leer un archivo .bin, y ya lo pude meter a una variable de tipo vector, pero lo que no se como hacer es analizar su contenido. Necesito hacer desaparecer un simbolo que es un cuadrado ascii...

Alguien sabe como poder ir navegando linea por línea y borrar lo que no me sirve.

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

Hola, goyoko.

Lo que pides no tiene respuesta si no aclaras más el problema.

En principio un archivo .bin ¿qué tipo de archivo es? ¿qué información contiene? ¿de qué modo está esa información estructurada?

En segundo lugar "un cuadradito en ASCII" puede ser cualquier caracter extendido (los que van desde 128 hasta 255), el dibujo es lo de menos, lo importante de un caracter es su valor numérico.

Por último ¿qué es una línea del fichero? y, sobre todo ¿qué es lo que quieres borrar?

Aclaranos un poco más estas dudas y posiblemente alguien te eche un cable.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: me falto info Responder citando

Aqui les va el programa.

El archivo alarmas lo genera un equipo, entonces lleva información mas symbolos ascii.. como esto:

' &  ,   -@ *02/05/00 15:00:33.069 7IRD-E4 DISPARO INSTANTANEO ALARMA  &   -@ *02/05/00 15:00:33.069 7IRD-E4

y me interesa solo capturar el texto legible como números de fecha y letras. Espero me haya explicado bien.

Entonces lo que tengo es capturar cada una de las líneas del archivo y unas vez que las tengo capturadas... no se como trabajar dentro.

El programa está hecho en C++ solamente.. una vez que aprenda como lo quiero pasar al Builder.

Agradeceré su ayuda.

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
vector<string> v;
ifstream in ("alarmas.bin",ios::in | ios::binary);
string s,line;

while (getline( in, line ))
v.push_back(line); //se introduce la cadena

for ( int i = 0; i<v.size(); i++ )
cout << v[i] << "\n";

system("PAUSE");
return 0;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

lo que puedes hacer es

int caracter;

for ( int i = 0; i<v.size(); i++ )
{
caracter=v[i];
if(caracter >=48 && caracter<=57 )
cout << v[i] << "\n";
}

La asignacion en caracter=v[i], te da el valor ascii, y el rango de 48 a 57 son los numeros del 0 al 9 (an ascii), por lo cual la funcion te mostrraria solo los numeros del 0 al 9, asi podrias hacer con las letras y los simbolos que vienen en tu cadena y pasarlos a una variable char auxiliar.

espero que te sirva

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

Hola.

En la respuesta que das, nuno, ignoras el detalle de que v es un vector de strings (no de caracteres) por lo que la asignación
Código:
 caracter=v[i];
no dará el resultado que pretendes. Además no es necesario hacer la conversión de un char para conocer su valor numérico, en realidad un char es un tipo especial de entero.

La cuestión es que hay que recorrer cada elemento de v e ir guardando los caracteres que interesen (esto será cosa de goyoko, a simple vista diría que le interesan los caracteres alfanuméricos, '/', ' ', ':', '+'. Pero es posible que los otros caracteres también signifiquen algo y le interese guardarlos, esto debe averiguarlo él). Un modo que se me ocurre es ir copiando en el string s (que en tu código se declara y no se usa) los caracteres que consideres válidos. Para hacerlo, respetando el código inicial y partiendo de la idea de nuno, podrías usar:
Código:
   //...
   while (getline( in, line )) {
      //Aquí es donde proceso la línea, antes de guardarla en v
      //Primero vaciamos la cadena "limpia"
      s.clear();
      //Luego recorremos la cadena leída del fichero, guardando sólo caracteres "válidos"
      for (int i = 0; i < line.length(); i++)
         if ((line[i] > 'a' && line[i] < 'z') || (line[i] > 'A' && line[i] < 'Z') /*aquí añade todo lo que quieras que se guarde*/ || (line[i] == '+'))
            s.push_back(line[i]);

      v.push_back(s); //se introduce la cadena "limpia"
   }
   //...
Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Funciono bien Responder citando

Enrique... funciona bien lo que me dijiste. Sin embargo no puedo diferenciar los espacios. Cuando integro los espacios " " a la sentencia if donde limpia la cadena, me aparece otra basura que hay y me elimina información.

Hay alguna forma o método para poder discriminar si el caracter que está siendo analizado es o no caracter algo así como s.ischar().

De antemano muchas gracias,
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

mira este ejemplo

int main(void)
{
char c = 'C';

if (isalpha(c))
printf("%c is alphabetical\n",c);
else printf("%c is not alphabetical\n",c);

return 0;
}

siempre te conviene trabajar con datos de tipo char y no AnsiString o String, ya que posees muchas mas funciones para manejar cadenas
Saludos!!!!!
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

¿Lo haces con comillas dobles? En ese caso estarás comparando un caracter con una cadena de caracteres, eso no debería permitirlo el compilador. Si es así cambia " " por ' ' y vuelve a probar.

Lo que dice nuno puede aplicarse perfectamente a tu código pues line[i] es un char. Echa un vistazo a la ayuda del Builder y verás que también está la función isalnum() (isAlfaNumeric) y otras de manipulación de caracteres, cuyo cometido es hacer lo que tú haces en la condición de la sentencia if.

Si te acostumbras a escribir el código que no te funciona (copiar y pegar, no se te ocurra reescribirlo pues es fácil olvidar o confundir un detalle, tampoco lo pegues todo si ya lo has hecho en otro mensaje de este hilo) junto a la descripción del error que comentas seguro que las respuestas que obtendrás serán más rápidas y acertadas.

Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Ahora si Responder citando

Ahora está funcionando como se debe. Esto fue lo que dejé definitivamente como código.

Sigo eso si con un pequeño defecto que corresponde al formato. Parece que hay muchos datos escritos en una sola línea. Entonces si quisiera formar columnas desde que se genera la fecha hasta una proxima fecha debiese contar los espacios intermedios y grabar eso en el vector final. En el fondo es dar el formato de salida.

#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
#include <vector>

using namespace std;

int main(int argc, char *argv[])
{
vector<string> v;
ifstream in ("alarmas.bin", ios::in | ios::binary);
ofstream out("alarmas_corregido.txt");
string s,line;
int j;

while (getline( in, line ))
{

/* En esta parte del código se recorre el string "line" que contiene la línea
amacenada desde el archivo y se bucarán los caracteres de interés */


s.clear();
for (int i = 0; i < line.length(); i++ )

if ( (isalnum(line[i])) || line[i] == ' '
|| (line[i] == ':') || (line[i] =='/') || (line[i] =='.'))

s.push_back(line[i]);

/* Se introduce la cadena limpia */

v.push_back(s);

}

for ( int i = 0; i<v.size(); i++ )
out << v[i] << "\n";


system("PAUSE");
return 0;
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Lo mismo pero con Builder Responder citando

Hola nuevamente,

Estoy tratando de hacer lo mismo pero con el builder ahora, pero lo que no se es como abrir un archivo binario con la herramienta OpenDialog que incluye Builder.

Puede hacer:

OpenDlg1->Execute();
RichEdit1->Lines->LoadFromFile(OpenDlg1->FileName);

Hasta ahí entiendo bien, pero no se como darle las mismas opciones del ifstream:

ifstream in ("alarmas.bin", ios::in | ios::binary);

Si alguien sabe algo de estos dialogs que incluye el Builder me sería de mucha ayuda o bien de algún método para poder hacerlo bien.

De antemano muchas gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola, goyoko, una cosa es cargar un fichero en un TRichEdit (que es el código que pones) y otra es abrirlo para analizarlo. Al usar LoadFromFile lo que obtendrás es el fichero antes de limpiarlo.

Para adaptar tu código anterior al Builder lo único que tienes que hacer, entiendo, es que se abra el fichero seleccionado en el TOpenDialog, algo así como
Código:
if (OpenDlg1->Execute())
   ifstream in (OpenDlg1->FileName.c_str(), ios::in | ios::binary);

Para mostrar tu fichero "limpio" podrías sustituir el código C++ que lo hacía:
Código:
for ( int i = 0; i<v.size(); i++ )
   out << v[i] << "\n";
por
Código:
for (int i = 0; i < v.size(); i++)
   RichEdit1->Lines->Add(v[i].c_str());

Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: .c_str() Responder citando

Que hace precisamente el metodo .c_str()

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

Convierte de AnsiString a char*
_________________
Siempre hay que tratar de ser el mejor, pero nunca creerse el mejor (Juan Manuel Fangio)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: me resulta a medias Responder citando

TRate con lo que me dijiste sobre el método .c_str(), pero al momento de entrar a la rutina de despliegue de datos en el RichEdit se cae y aparece una excepción. En este momento no la tengo, mañana la pondré acá en el foro.

for (int i = 0; i < v.size(); i++)
RichEdit1->Lines->Add(v[i].c_str());

Traté también con

RichEdit1->Lines->LoadFromStream(v[i].c_str());

Pero tampoco funca.

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

Hola, goyoko, te escribí el código de memoria y me despisté. El problema de trabajar con std::string es su conversión, primero debes convertirlo a cadena de caracteres usando c_str() y luego esa cadena has de convertirla a AnsiString para poder añadirla al TRichEdit:
Código:
for (int i = 0; i < v.size(); i++)
   RichEdit1->Lines->Add(AnsiString(v[i].c_str()));

Suerte.
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
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.