| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Lun 07 Mar, 2005 6:37 pm Asunto: analissis |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Lun 07 Mar, 2005 8:08 pm Asunto: |
|
|
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 |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Lun 07 Mar, 2005 8:46 pm Asunto: me falto info |
|
|
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 |
|
 |
nuno Cmdr

Registrado: 10 Feb 2003Mensajes: 143Ubicación: Córdoba - Argentina
|
Publicado: Lun 07 Mar, 2005 11:42 pm Asunto: |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mar 08 Mar, 2005 12:18 am Asunto: |
|
|
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ónno 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 |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Mar 08 Mar, 2005 6:17 pm Asunto: Funciono bien |
|
|
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 |
|
 |
nuno Cmdr

Registrado: 10 Feb 2003Mensajes: 143Ubicación: Córdoba - Argentina
|
Publicado: Mar 08 Mar, 2005 7:14 pm Asunto: |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mar 08 Mar, 2005 7:44 pm Asunto: |
|
|
¿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 |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Mar 08 Mar, 2005 8:10 pm Asunto: Ahora si |
|
|
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 |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Lun 14 Mar, 2005 5:28 pm Asunto: Lo mismo pero con Builder |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Lun 14 Mar, 2005 5:39 pm Asunto: |
|
|
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 |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Lun 14 Mar, 2005 6:11 pm Asunto: .c_str() |
|
|
Que hace precisamente el metodo .c_str()
Gracias |
|
| Volver arriba |
|
 |
nuno Cmdr

Registrado: 10 Feb 2003Mensajes: 143Ubicación: Córdoba - Argentina
|
Publicado: Mar 15 Mar, 2005 1:34 am Asunto: |
|
|
Convierte de AnsiString a char* _________________ Siempre hay que tratar de ser el mejor, pero nunca creerse el mejor (Juan Manuel Fangio) |
|
| Volver arriba |
|
 |
goyoko Ens

Registrado: 08 Abr 2003Mensajes: 47
|
Publicado: Mie 16 Mar, 2005 11:19 pm Asunto: me resulta a medias |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Jue 17 Mar, 2005 12:04 am Asunto: |
|
|
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 |
|
 |
|