Comparar cadenas de caracteres sacadas de un fichero
Estoy intentando procesar un fichero que no lo puedo leer como texto.
La información que me interesa comienza siempre con la misma cadena, 00:F5:02:40:00 en hexadecimal. El código que uso es el siguiente:
EL valor del sStarCross es #0'õ'#2'@'#0 y no hay forma de que en el bucle me cumpla la condición de la comparación bien. No se por donde cogerlo, es la primera vez que tengo que hacer algo así y ahora he visto que el problema está ahí, en como comparo buffer y sStarCross , que no se cumple la condición bien. |
Si las variables sStartCross y buffer son de tipo strings, prueba a comparar con la función de windows: lstrcmpi que es equivalente al strcmp del lenguaje C.
Puede que te sirva. |
El error que me da si lo escribo así:
es "Incompatible types: 'String' and 'PAnsiChar'" sStarCross y Buffer son ambos 'Strings' Me da el mismo error con la orden que me has dado. |
:confused: No se si me estoy perdiendo algo. Pero lo primero que veo es que estas utilizando el carácter #0, y recordemos que ese carácter se utiliza para marcar el final de una cadena. Por lo tanto cuando haces esto:
Como sStartCross comienza por #0, se considera una cadena vacía, así que en el momento en que el contenido de buffer también comience por #0 la condición se cumplirá, es decir, no se tendrán en cuenta el resto de caracteres. Yo te sugiero que para hacer comprobaciones en las que interviene el carácter #0 utilices funciones como CompareMem, mucho mas rápida, y no te metas a utilizar funciones para el tratamiento de cadenas ;) |
Cita:
|
Y si siempre comienza por esa cadena ¿por qué no te lo saltas y empiezas en la posición siguiente?
¿Puedes ponernos un trocito del fichero para probar? |
siempre puedes escribir una pequenia funcion propia de comparacion, con un simple ciclo dentro que compare elemento por elemento y que te devuelva un true en caso de ser iguales.
Aunque creo haber visto dentro de delphi una funcion similar pero no recuerdo donde. |
Casimiro:
Se que podría saltarmelo y buscar la cadena 'F5:02:40:00' directamente, pero eso no resolvería mi problema, solo lo parchearía. Y si en un momento dado tengo que pelearme con cadenas cuyo identificador comienza por '00' tendré que aprender, y ya que el tema me pilla pez, mejor aprenderlo sin vicios ni malas costumbres Aqui un trozo: Código:
00000000:00 00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .. Esa es la opción que estaba barajando y que parametrizandola me dará toda la funcionalidad que busco. |
Una primera aproximacion sería algo como esto:
La función buscar, nos devuelve la posición de la cadena que buscamos, o -1 si no la encuentra. La única desventaja es que cargamos todo el archivo en memoria y si el archivo es muy grande (un par de decenas de megas) puede resultar un problema. |
Ostias! Eso me llevará un rato leerlo, comprenderlo y asimilarlo. Asi que aprovecho para hacer una pausita, ir al gimnasio, comer y luego con fuerzas renovadas me enfrentaré a esto.
Gracias Seoane y a todos los demás. PD:Soluciones mas sencillas también se aceptan :D |
Cita:
|
Cita:
Por cierto, Papulo, ¿eso es una tabla de algún tipo de base de datos que quizás sea pública su estructura, no? |
Cita:
|
:( Total, mucho tendría que estar en el gimnasio para ponerme como el amigo Xander que aquí parece un croasant :D (sin animo de ofender)
Aqui una fotos de un crosant para comparar http://images.google.com/images?hl=e...-8&sa=N&tab=wi :D :D :D |
Cita:
No os imaginais lo descoordinadas que son las grandes empresas, BOSCH, VALEO y esta gente. A veces da la sensación de que ves ciclopes dando palos de ciego. A todos los demás, el ejercicio viene de fábula, yo no estoy tan cachas como el amigo bombero, pero estoy cuadradete tambien, y a parte hago esgrima y juego a balonmano. :D |
Si son registros de longitud fija lo tienes sencillo.
|
Cita:
¿Me lo expliquen? ¿Que quieres decir con eso?:confused::confused: |
que si el fichero es de una forma parecida a esta, tiene una cabecera y luego los registros en sí:
xx bytes -> cabecera de longitud la que sea (puede no tener cabecera) 64 bytes -> datos de un registro 64 bytes -> datos de otro registro 64 bytes -> datos de un registro más 64 bytes -> etc... cada uno de esos 64 bytes (es un ejemplo), pueden estar subdivididos en los campos de la tabla: 08 bytes -> código 32 bytes -> descripción (es el dato que te interesa, creo) 08 bytes -> precio xx bytes -> etc... Si este fuese el caso tan sólo tendrías que "saltar" la cabecera y luego leer/saltar a intervalos fijos para los datos que te interesan de cada registro. Aunque seguro que esta posibilidad ya lo habrás comprobado, era sólo por dar una idea más. |
Negativo, casimiro, no es de longitud fija.Si lo fuera sería un chollete. :D
|
al menos podrían decirte qué tipo de archivo es :o
|
La franja horaria es GMT +2. Ahora son las 00:57:21. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi