Programa para comparar texto

BEDI

Buenas, estoy estudiando C en la uni pero no creo que lleguemos a dar tanta materia como para poder hacer lo que pretendo.

Vereis, tengo una especia de base de datos en un .txt. En ella esta el nombre de una persona y a su derecha ciertas puntuaciones.
www.euskalnet.net/bedi/Alianza.txt

Pues bien, esas puntuaciones pueden variar al cabo de unos dias y de ese modo tendria otro .txt con los datos actualizados. Lo que quiero saber es que persona a cambiado la puntuacion que tiene a su derecha

Si alguien es tan amable de tomarse media hora para hacer algo que haga esa funcion o me de unas pautas a seguir para hacerlo yo me haria un buen favor. Se que no es facil pero de retos vive un programador no??
jeje venga gracias

IS4kO

Aquí te van unas posibles pautas:

Tendras que tener otro fichero en el que comparar.

Fichero A (en el que salen las puntuaciones actualizadas)
Fichero B (en el que está la ultima versión guardada)

Los abres y vas comparando linea por linea..... que no coinciden takatá

Me imagino que la practcia irá encaminada por ahí, aunque pueden darse multitud de situaciones y soluciones..

Suete :)

BEDI

Claro el problema es que yo estoy en ing. industrial y damos C pero sin grnadisimas pretensiones... Ahora estamos estudiando estrcuturas y typedef.

El caso es que no sabemos abrir ficheros y ni compararlos. Por eso pido un poco de ayuda. Por cierto, efectivamente tengo dos ficheros con los datos modificados, si de otro modo se puede hacer mas facil... uno se puede adaptar

TeKaNeO

Esto es un codigo que hace mas o menos lo que pides. Te lo pego y te explico:

http://rafb.net/paste/results/Oyc6nb44.html

Esto basicamentes una funcion de un program que tengo hecho. Lo que haces es: abre 2 ficheros de 2 librerias: 1 y 2 y un fichero final.

Ambas librerias pueden tener distintos libros y en diferentes cantidades. Pongamos un ejemplo:

Libreria 1:

El Quijote 5 libros
Las rosas de Don Mochilo 7 libros
La casa de Bernarda Alba 5 libros

Libreria 2:

Macario Piedradura 3 libros
El Quijote 2 libros
Las rosas de Don Mochilo 3 libros.

Al final, tendriamos que sacar, que es similar a tu caso, un fichero final actualizado con ambas librerias. Quedaria asi:

Final:

El Quijote 7 libros
Las rosas de Don Mochilo 10 libros
La casa de Bernarda Alba 5 libros
Macario Piedradura 3 libros

Imagino que sera algo similar a lo que pides. Imagino que usas C y estructura de datos.

Espero te de una orientacion al menos. Por cierto la funcion para comparar nombres es: strcmpi(nombre,nombre). Si da 0 son iguales si es !=0, son diferentes. La tienes dentro de la libreria <string.h>.

En este caso, comparo en los IFs los codigos de los libros, pero en tu caso pondrias IF(strcmpi(lib1.titulo,lib2.titulo)==0)... Una vez que has encontrado 2 nombres iguales, EN TU CASO NO EN EL EJEMPLO, comparo las cantidades como indicas, si son diferentes pues insertas en el registro localizado del fichero inicial, la cantidad del que actualiza ( bien si tienes los datos en memoria actualizas en memoria y luego al final escribes todos los registros actualziados al fichero final ) o bien directamente actualizando el fichero inicial, segun veas ( con fseek y bla bla, supongo que lo abras dado )

Imagino que estaras dando Ficheros Binarios, ya que el codigo se basa en ellos.

Saludos^^

E

#1, yo cargaría los datos leidos del .txt en arrays y los compararía.
Y por cierto, si quieres la solución porque es un problema de alguna asignatura, ok. Ahora, si es para tu uso, ¿conoces Excel? ...

BEDI

TeKaNeo muchas gracias por ese codigo y la explicacion. La libreria string si que la tengo estudiada, pero la stdlib.h y ctype.h no se que comandos tienen ni para que sirven. No estoy dando ficheros binarios como apuntas, pero creo que si llegaremos a darlo

Por lo que puedo entender veo que en mi caso seria hacer una structura para cada persona, luego abrir 3 ficheros (no se como, pero es evidente que haces eso). Depues lees los dos primeros ficheros (que tampoco se que patron sigue para leerlos ¬¬) y ya despues casi que me pierdo porque no se como funcionana esas lineas

ElTutor, efectivamente es un programa para uso propio. En principio pense en hacerme un programa mucho mas simple para repasar amteria de clase, pero me he dado cuenta que se puede llegar a hacer un progrmaa que me es realmente util, solo que me faltan aun unos pocos conocimientos.
Tu sabrias hacer lo siguiente: Cojer cada fila de ese documento de texto (que vienen a ser los datos de una persona) y meterlos en una estructura con los datos de cada jugador??

Como ya he dicho aun no he dado la materia que me hace falta, pero se me ocurre lo siguiente que es mas o menos lo que comentas(suponiendo que existan dichos comandos para ficheros):

1.- Reservar un espacio X en memoria para cada variable dentro de la estructura y asi me entren bien los datos del nombre, puntos sin importar la longitud

2.- Analizar el fichero por filas

3.- Cada X espacios de caracter, meter toda esa info en la primera variable de mi estructura, cada X+X meterlo en la segunda, cada X+X+X en la tercera.

4.- Hacerlo en los dos archivos de texto

5.- Compararlos y dar un mensaje donde haya error

Esta es la solucion mas facil que se me ocurre. Es posible hacer lo que digo o simplemente es una cosa sin pies ni cabeza???
Si me ayudais en esto sois unos cracks ;)

EDIT: sino simplemente con lo que dice Is4ko tambien se podria me parece. Comparar directamente solo las filas y dar mensaje si difieren. Asi te ahorras lo de guardar todos los datos en una estructura, aunque eso sea tambien seria interesante complica mucho el programa

LoRTH

Trabajar con ficheros, es 1000 veces mas lento que trabajar en RAM, en tu problema no pasaria nada, pero con un texto mucho mas largo...

Bedi, las funciones que necesitas de stdio.h, stdlib.h, string.h, son:

FILE *f; ---> no es funcion pero es para declarar un archivo.

-fopen(); ---> abrir archivo
-fclose(); ---> cerrar archivo
-foef(); ---> saber si es final de fichero, si supieras el tamaño es siempre igual, de largo, no haria falta.
-fgets(); ---> leer toda una linia
-strlen(); ---> contar numero de letras
-malloc(); --> asignar espacio dinamico
-free(); ---> liberar memoria

El lunes tengo examen de programacion, esta tarde o mñn me pondre con tu problema, a ver si me sale, seria un buen entreno...

BEDI

Lorth pues espero tu practica entonces :)
Si puedieras meter los datos en estructuras como te digo antes ya seria la ostia, ya que la lista se puede ordenar por puntos y cambian las posiciones de fila, luego habria que comparar teniendo en cuenta la primera variable de la estructura. Nose si me explico.

Aun asi, si lo haces de la manera sencilla me haces un gran favor y de paso te lo ahecs a ti tambien jejej

TeKaNeO

Aqui tienes tu programa que funciona en ficheros de formato BINARIO, por si quieres echarle un ojillo :P .

http://rafb.net/paste/results/dLMZOH32.html

Mañana te doy una explicacion detallada de cada punto/funciones que he usado porque tengo algo de prisa ya que voy a salir.

Me ha servido de practica tu ejercicio, he estado bastante entretenido :P

Lo he hecho basicamente es actualizar el fichero original con los jugdores en base al fichero de actualizacion con los nuevos datos. Tan solo me faltaria una funcion que indique que jugador ha cambiado en su puntuacion, pero esto en verdad, es "tonteria" a mi parecer puesto que en el fichero de actualizacion solo deben aparecer los jugadores que han obtenido diferentes puntuaciones o edificios, no creo que aparezcan los que no han cambiado ninguno de estos parametros. Es como lo he tomado yo.

Tambien me faltaria una funcion ordenar datos en funcion de la puntuacion y listo, eso ya lo hare mañana xD

Saludos y si tienes dudas, postea ^^

SiCk

Yo usaría XML (pero dudo que se pueda en C)

BEDI

wow TeKaNeo :O

Impresionado me has dejado. Solo tengo un pequeño problemilla y lo pruebo. No me abre el archivo alianza. Tengo que ponerlo con alguna extension especial o en algun directorio concreto?

TeKaNeO

A ver te explico:

El fichero alianza no existe la primera vez que abres el programa. Cuando lo abres por primera vez, debes dar de alta jugadores tanto en el fichero alianza como en el de actualizacion si asi lo quieres.

Tras esto, le das a opcion 7 y salvas el fichero binario con los jugadores y luego a 9 para salir.

Cuando vuelvas a abrir el programa, los datos del fichero alianza se cargaran en memoria y podras visualizarlos con la opcion 2,4 y 6 ( memoria ) y asi ya no te dara el error de "Error abriendo fichero...".

Saludos^^

Y

Ya existe el programa diff, simplemente ejecutas diff fichero1 fichero2 y te devuelve las diferencias de los dos programas, luego simplemente le dices que es lo que quieres que te guarde (antes, durante o después de la ejecución).

BEDI

Yohnah
Puedes explicar un poco mas detalladamente como funciona eso de diff? De todas formas buscare algo por google, pero, me serviria por ejemplo, para que me guarde en un tercer archivo las lineas que son diferentes?

E

Por cierto, ahora que se reabre este post, y aunque ya no está colgado el código de Tekaneo, me gustaría hacer una apreciación sobre lo que observo en este foro.

Dejando a un lado la programación web, el resto de soluciones que se suelen dar a los problemas que la gente plantea, suele enfocarse desde el punto de vista de la programación estructurada tradicional.
Me explico, casi nunca veo soluciones con un enfoque orientado a objetos.

Está por ver algún programita de alguien que solucione la duda de otro que aborde el problema con mentalidad de objetos y no de procedimientos.

Supongo que esto es así pq muchos son estudiantes de módulo/universidad que dan una mierda de programación (yo la he dado, sé lo que hablo, modula2...etc.) y están comenzando sus primeros pasos. Y otros son autodidactas que buscan también en el típico libro: "Aprenda como si estuivera en -1".

A ver si saco un hueco y cuelgo un programa para comparar 2 ficheros con la estructura que decía BEDI con un enfoque "actual y moderno". Si tengo un hueco lo hago.

Esto es simplemente una reflexión, que no se ofenda nadie.

Salu2

javithelong

No soy nada especialista en objetos, pero vamos, en C me parece un problema sencillisimo de resolver...

En objetos ya no lo veo tan sencillo XD

Igual es que aun no conozco la potencia de java, pero vamos... todo a su tiempo :P

Saludos

PD:Como respuesta a #1, con fgets y sscanf en un bucle, almacenas todos los datos en una estructura, y lo mismo con el 2º fichero, luego vas comparando (buscando por nombres iguales, asi podemos hacer ficheros que varien el orden) y haciendo con los puntos lo que queramos (que realmente no se que quieres hacer con ellos xD)

BEDI

Bueno en vista de que algunos me han mandado un privado diciendome que probaran a hacerlo y por aqui tambien lo intentareis, voy a comentar esactamente la utilidad del programa que quiero conseguir.

Va a ser un programa de estadisticas, donde cada usuario va avanzando y aumentando en puntos de formacion, edificios, unidades... El programa sera capaz de comparar dos tipos de estructura-columna(siempre por pares del mismo tipo) con el fín de ver quien a avanzado y cuanto. Unas veces se ejecutara con un tipo de archivo y otras veces con el otro, dependiendo del tipo que queramos trabajar:
www.euskalnet.net/bedi/Alianza.txt
www.euskalnet.net/bedi/General.txt
(archivos que pueden contener mas filas)

Creo que lo ideal en este programa de estadistica para brindar infinidad de opciones es lo siguiente(para cada formato); Declarar una estructura para cada fila, con sus correspondientes variables dentro y así despues poder operar sin problemas con los datos. Así, el programa analiza por filas, y guarda mediante un bucle cada variable en su sitio. Supongo que necesitaremos "un signo separador" para las columnas en el .txt. De este modo se declarará una variable tipo alianza/general por cada fila analizada Ej:

typedef struct
{char jugador;
char posicion;
int puntuacion;
int edificio;
}alianza

typedef struct
{int puesto;
char jugador;
int formacion;
int edificio;
int unidades;
int total;
int edificio;
}general

Una vez tengamos todas estas variables guardadas en memoria somos dioses para hacer lo que queramos. La salida tendra las diferencias entre la pareja. Es preferible que sea en un .txt, pero un printf también sirve.

Lo ideal es que en la salida tengamos impresas de este modo las diferencias por cada alianza.jugador que se haya modificado (Ejemplos reales):

  • Para estructura alianza Alianza:
    NoXiS Sub-Capo 138 1
    Donde los numeros son la resta de alianza.puntuacion del segundo archivo menos alianza.puntuacion del primero. De igual modo con la variable alianza.edificio

-Para estructura General:
1 Pervetro [MANDC] 20 3 23 2
De una manera similar que en alianza, con la particularidad de que general.puesto sea el puesto final. Aqui tambien sacamos partido de la estructura y al hacer la comparacion de los dos archivos la hacemos teniendo en cuenta general.jugador, ya que de un archivo a otro puede variar la fila en la que se encuentra(por tener mas puntos)

Bueno, es un programa creo que con bastantes conceptos y tambien creo que bastante util para poder aprender muchas cosas de su codigo. Espero que no se os haga muy pesado y no lo deis por muerto ;)
Y muchas gracias a todos los que me habeis ayudado por el post y por privado a solucionarlo

B

#15

Que yo sepa el lenguaje de programación C, no esta muy orientado a objetos ya de por si. Yo podria hacer y colgar el diseño del dominio para una estructura objetual con las clases del dominio. Pero en UML, el UML va muy bien para hacer una implementacion en Java, pero en C... lo veo muy dificil.

Voy a leer bien el enunciado y te hago el modelo del dominio.

formacion, edificio, unidades, TOTAL!!!! DIOS Me duele la vista ver un Total en una base de datos!!!! Por favor BORRALO YA!!!! Ademas es facilmente calculable y se actualizara cada dos por tres!!

Una de las leyes de los diseñadores de estructuras de base de datos es: Nunca introduciremos un campo caculado en una tabla, con la única excepción de que ese campo sea muy dificil de calcula y lleve mucho tiempo. (estamos hablando de minutos para calcular el campo) no hacer una suma de 3 atributos.

Podrias por favor escribir o colgar un scan del enunciado completo del problema? para poder hacer el diseño en condiciones.

BEDI

Primero, os agradeceria que si vais a debatir si C esta orientado a objetos, lo hagais en otro post.

No hay ningun enunciado, es un programa que tengo en mente, que pretende sacar conclusiones a partir de copy&paste de esa serie de datos sacados de una web. Por ese motivo el total se incluye en el c&p y tambien hay que trabajar con él

El enunciado es el que pongo aqui arriba, si aun os queda alguna duda os la respondere rapidamente.

B

Vale

Cual es la finalidad de esos datos? (porque los guardamos? son jugadores de algo?)

Podrias por favor exlpicar cada uno de los atributos de la estructura? (por ejemplo que significa edificio...)

que causa que se modifiquen?

B

Lo siento BEDI no me habia enterado muy bien de que iba la cosa, hombre siempre podrias hacerlo mediante objetos pero no tiene sentido alguno, pensaba que esos archivos eran la base de datos de tu aplicativo, =(

BEDI

Efectivamente, los nombres son jugadores de un juego via web. Cada jugador puede mejorar, aumentando los puntos de 3 maneras. Mejorando los puntos formacion, puntos de edificio o puntos de unidades. La variable edificio, es el numero de edificios que posee el jugador.

Pretengo hacer estadisticas de dos lugares distintos, por ello hay dos archivos. El general.txt es el copy&paste del ranking general del juego. La alianza.txt es el copy&paste de los jugadores que pertenecen a una misma alianza

EDIT: Son tabulaciones, pero como apunte en el anterior post, es posible que haya que modificarlos y poner algun tipo de "simbolo" para facilitar el echo de guardar los datos en variables

LoRTH

Los espacios entre campos, entre los nombres y los numeros, en el .txt que son tabulaciones, espacios?¿

No hice el programa antes del examen, porque entre que me dio palo, y luego me mire todo.... Cuando acabe examenes, a ver si le hecho un vistazo a eso, pero es importante lo de arriba.

Hannibax

El programa TextPad te lo hace el solito... y es gratuito.. y como veo que no lo kieres por el gusto de hacerlo.. es decir que te importa si lo has prgramado tu o no.. te recomiendo que uses el TextPad... es buenisimo.. te compara varios archivos y te crea otro con las diferencias.. y bueno infinidad de utiidades.

Un Salido.

E

C no es orientado a objetos.
C++ sí. Y aun así tampoco es puramente un lenguaje orientado a objetos.
Por eso en C, efectivamente, dudo que nadie de un enfoque orientado a objetos. Pero en C++ sí, o en C#.

javithelong

Atsumi, en #15 dije:

"No soy nada especialista en objetos, pero vamos, en C me parece un problema sencillisimo de resolver...

En objetos ya no lo veo tan sencillo XD

Igual es que aun no conozco la potencia de java, pero vamos... todo a su tiempo"

Eso significa que en C, que no es orientado a objetos, es sencillisimo de hacer. En java, que si es orientado a objetos, no sabría hacerlo tan sencillo. O me expliqué mal, o leiste mal ;)

Hannibax

A mi me parece mucho mas sencillo java que C... bueno en realidad me parecen mucho mas sencillos los lenguajes orientados a objetos que los iterativos.... de todas formas imagino qeu sera a lo que te aconstumbres.. yo aprendi JAVA primero y ahora en la facultad me olbigan a hacer cosas en Pascal.. y pffff hecho un monton de menos los contrucotores, las clases ... snif snif :(

javithelong

juju, a mi me sobran xD

Usuarios habituales