Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Lectura de Comandos desde un TXT

Estas en el tema de Lectura de Comandos desde un TXT en el foro de C/C++ en Foros del Web. Buenas Compañeros los vengo a molestar queria saber si me pueden ayudar a leer comandos que estan escritos en un TXT para agregarlos a un ...
  #1 (permalink)  
Antiguo 13/03/2014, 01:05
 
Fecha de Ingreso: marzo-2014
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Lectura de Comandos desde un TXT

Buenas Compañeros los vengo a molestar queria saber si me pueden ayudar a leer comandos que estan escritos en un TXT para agregarlos a un ABB y un AVL en Geany de Ubuntu

Ejemplo TXT

Begin

Create(1,2,3,4,5,A)

End

digamos que este es el TXT que voy a leer los numeros van al AVL y la letra A es el nodo del ABB.

ya tengo el lector de TXT y ya me agrega al arbol pero sin comandos solo lee las lineas y espacios hasta encontrar el final del TXT y estoy en blanco ya no se que hacer Ayuda Se los Agradecería
  #2 (permalink)  
Antiguo 13/03/2014, 08:43
Avatar de TSG
TSG
 
Fecha de Ingreso: septiembre-2013
Ubicación: España
Mensajes: 373
Antigüedad: 11 años, 2 meses
Puntos: 9
Respuesta: Lectura de Comandos desde un TXT

Hola muy buenas,

¿Y su código, para poder ayudarlo?
Sólo ayudamos y resolvemos dudas, no hacemos trabajos.

Un cordial saludo.
  #3 (permalink)  
Antiguo 13/03/2014, 12:19
 
Fecha de Ingreso: marzo-2014
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Lectura de Comandos desde un TXT

o claro no sabia como lo ayudaban, este seria mi codigo de lectura que actualmente tengo y me funciona

FILE *archivo;
char x;
archivo = fopen("prueba.txt","r");

if (archivo == NULL){

printf("\nError de apertura del archivo. \n\n");
}else{

printf("\nEl contenido del archivo de prueba es \n\n");

while (feof(archivo) == 0){
x = fgetc(archivo);
cout<<x;
insertabb(&t,x);
}
}
fclose(archivo);
  #4 (permalink)  
Antiguo 13/03/2014, 12:55
Avatar de nup_  
Fecha de Ingreso: noviembre-2010
Mensajes: 265
Antigüedad: 14 años
Puntos: 32
Respuesta: Lectura de Comandos desde un TXT

Hola:

Puedes empezar haciendo esto:

Crear la clase ABB que represente un Árbol Binario de Búsqueda.
Crear la clase AVL q represente un Árbol AVL.
Creas un objeto de cada clase.
Usas la función adicionar de ese objeto para ir agregándole datos

Para todo esto te puedes auxiliar de estos docs:
http://es.wikipedia.org/wiki/%C3%81rbol_AVL
http://es.wikipedia.org/wiki/%C3%81r..._b%C3%BAsqueda
Aunque cualquier curso de Estructuras de datos q se respete de los q hay en la red te puede servir.

slds;

nup_
  #5 (permalink)  
Antiguo 13/03/2014, 13:12
 
Fecha de Ingreso: marzo-2014
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Lectura de Comandos desde un TXT

Si lo que es la estructura del ABB y el AVL ya la tengo y me agrega perfectamente pero mi problema es leer los comandos de ejecucion desde el TXT como por ejemplo:

INSERTE= cuando se encuentre con esta palabra en el TXT comience a insertar lo que estara entre parentesis hasta cerrar parentesis Ejemplo:
INSERTE(1, 2, 3, 4, 5, A) y asi sucesivamente hasta encontrar el final del TXT espero haberme explicado mejor esta vez y les agradesco su tiempo
  #6 (permalink)  
Antiguo 13/03/2014, 13:57
 
Fecha de Ingreso: marzo-2014
Mensajes: 1
Antigüedad: 10 años, 8 meses
Puntos: 0
Pregunta Respuesta: Lectura de Comandos desde un TXT

Cuales son las estructuras de tu ABB y AVl?

como podríamos probar y enviarte una solucion...

Saludos

Staff
  #7 (permalink)  
Antiguo 13/03/2014, 15:06
 
Fecha de Ingreso: marzo-2014
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Lectura de Comandos desde un TXT

Tienes Razon aqui esta el ABB algunos comandos los tuve que cambiar porque como estoy trabajando en UBUNTU los dos trabajan bien:

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

using namespace std;

struct arbol{
char elemento;
struct arbol*izq;
struct arbol*der;
};

arbol *t = NULL;

// Funcion Para Agregar Al ABB
void insertabb(struct arbol **t,char etiqueta){
struct arbol*p,*n;

if(*t==NULL){
n=(struct arbol*)malloc(sizeof(struct arbol));
n->izq=NULL;
n->der=NULL;
n->elemento=etiqueta;
(*t)=n;
}
else{
p=(*t);

if(etiqueta<p->elemento){
insertabb(&p->izq,etiqueta);
}
else{

if(etiqueta>p->elemento){
insertabb(&p->der,etiqueta);
}
else{
cout<<"Elemento Repetido";
}
}
}
}



//Funciones Para Ordenar El Arbol
void enOrden(arbol *t){
if(t!=NULL){
enOrden(t->izq);
cout << t->elemento<< " ";
enOrden(t->der);
}
}

void preOrden(arbol *t){
if(t!=NULL){
cout << t->elemento <<" ";
preOrden(t->izq);
preOrden(t->der);
}
}

void postOrden(arbol *t){
if(t!=NULL){
postOrden(t->izq);
postOrden(t->der);
cout << t->elemento << " ";
}
}

void verArbol(arbol *t, int n){
if(t==NULL)
return;
verArbol(t->der, n+1);
for(int i=0; i<n; i++)
cout<<" ";
cout<< t->elemento<<endl;
verArbol(t->izq, n+1);
}



// Funcion Para Agregar Desde Consola
void ingreManual(){
int n,i,etiqueta;
printf("\n\n\n\n\t\t\tINGRESO DE INFORMACION EN EL ABB");
printf("\n\n\t\t\tIngrese Cantidad De Nodos a Crear : ");
cin>>n;
for(i=0;i<n;i++){
cout<<"\nIngrese Valor Al Nodo "<<i+1<<" :";
cin>>etiqueta;
insertabb(&t,etiqueta);
}
system("clear");
}



//Funcion Para Agregar Archivo .txt
void IngreTxt(){

FILE *archivo;
char x;
archivo = fopen("prueba.txt","r");

if (archivo == NULL){

printf("\nError de apertura del archivo. \n\n");
}else{

printf("\nEl contenido del archivo de prueba es \n\n");

while (feof(archivo) == 0){
x = fgetc(archivo);
cout<<x;
insertabb(&t,x);
}
}
fclose(archivo);
}





// Funcion Para Mostrar El Contenido
int Mostrar(){
printf("\n\t\tMOSTRANDO RECORRIDO DEL ARBOL BINARIO DE BUSQUEDA (ABB)");
printf("\n\n\nMostrando Arbol Binario De Busqueda \n\n");
verArbol( t, 0);

printf("\nOrdenes Del Arbol Binario De Busqueda");

printf("\n\nEn-Orden : ");
enOrden(t);

printf("\n\nPost-Orden : ");
postOrden(t);

printf("\n\nPre-Orden : ");
preOrden(t);

return(0);


}


//Menu Del Programa
int main(){
int op1;
char op2='s';
while ((op2=='s')||(op2=='S'))
{
printf("\n\n\n\n\n\n\t\t\tMENU DE ARBOL BINARIO DE BUSQUEDA (ABB)");
printf("\n\n\t\t\t-> Ingrese 1 Para Agregar Informacion Al ABB");
printf("\n\t\t\t-> Ingrese 2 Para Recorrer ABB");
printf("\n\t\t\t-> Ingrese 3 Para Buscar");
printf("\n\t\t\t-> Ingrese 4 Para Eliminar");
printf("\n\t\t\t-> Ingrese 5 Para Agregar Archivo .txt");
printf("\n\t\t\t-> Ingrese 6 Para Salir");
printf("\n\n\t\t\t -> Ingrese Opcion : ");
scanf("%d",&op1);
system("clear");
switch(op1)
{
case 1:
ingreManual();
break;

case 2:
Mostrar();
break;

case 3:

break;

case 4:

break;

case 5:
IngreTxt();
break;

case 6:

break;

default:
printf("\n\nLa Opcion Ingresada No Existe En El Menu Del Arbol Binario De Busqueda:\n" "");
break;
}
printf("\n\n\n\n\n\tDesea Regresar Al Menu Del Arbol Binario De Busqueda ...s/n?:"" ");
cin>>op2;
system("clear");
if((op2=='n')||(op2=='N'))
printf("\n\n\n\n\n\n\n\n\t\tPresione ENTER para Cerrar La Consola De Ejecucion");
}
}



Y Aqui esta el AVL pero este solo lo e probado que me agrege desde consola todavia no le hecho que me agrege desde TXT

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

struct AVL{
int elemento;
struct AVL *izqda;
struct AVL *drcha;
int altura;
};


AVL *A = NULL;

#define AVL_VACIO NULL
#define maximo(a,b)((a>b)?(a):(b))
#define altura(n)(n?n->altura:-1)

// Funciones

void Simple_derecha(struct AVL **A){
struct AVL *p;

p=(*A)->izqda;
(*A)->izqda=p->drcha;
p->drcha=(*A);
(*A)=p;

/*Ajustamos La Altura*/
p=(*A)->drcha;
p->altura=maximo(altura(p->izqda),altura(p->drcha))+1;
(*A)->altura=maximo(altura((*A)->izqda),altura((*A)->drcha))+1;
}

void Simple_izquierda(struct AVL **A){
struct AVL *p;

p=(*A)->drcha;
(*A)->drcha=p->izqda;
p->izqda=(*A);
(*A)=p;

/*Ajustamos La Altura*/
p=(*A)->izqda;
p->altura=maximo(altura(p->izqda),altura(p->drcha))+1;
(*A)->altura=maximo(altura((*A)->izqda),altura((*A)->drcha))+1;
}

void Doble_izquierda_derecha(struct AVL *A){
Simple_izquierda(&((A)->izqda));
Simple_derecha(&A);
}

void Doble_derecha_izquierda(struct AVL *A){
Simple_derecha(&((A)->drcha));
Simple_izquierda(&A);
}

void ajusta_AVL(int e, struct AVL **A){


if ((*A)!=NULL){
if (e > (*A)->elemento){
ajusta_AVL(e,&((*A)->drcha));
}else if (e < (*A)->elemento){
ajusta_AVL(e,&((*A)->izqda));
}
}

switch (altura((*A)->izqda) - altura((*A)->drcha)){
case 2:
if (altura((*A)->izqda->izqda) > altura((*A)->izqda->drcha))
Simple_derecha(A);
else Doble_izquierda_derecha(*A);
break;
case -2:
if (altura((*A)->drcha->drcha) > altura((*A)->drcha->izqda))
Simple_izquierda(A);
else Doble_derecha_izquierda(*A);
break;

default:
(*A)->altura =maximo(altura((*A)->izqda),altura((*A)->drcha))+1;
}
}


void insertaAVL (struct AVL **A, int e){
struct AVL *p;
p=(*A);
if(*A==NULL){
p=(struct AVL *)malloc(sizeof(struct AVL));
p->elemento = e;
p->altura = 0;
p->izqda = NULL;
p->drcha = NULL;
(*A)=p;
}
else{
p=(*A);
if(e < p-> elemento){
insertaAVL( &p -> izqda, e);
ajusta_AVL(e,&(*A));
}
else{
if(e > p -> elemento){
insertaAVL( &p -> drcha, e);
ajusta_AVL(e,&(*A));
}
else{
cout<< "Elemento Repetido";
}
}
}
}


void ingreManual(){
int n,i,etiqueta;
printf("\n\n\n\n\t\t\tINGRESO DE INFORMACION EN EL ABB");
printf("\n\n\t\t\tIngrese Cantidad De Nodos a Crear : ");
cin>>n;
for(i=0;i<n;i++){
cout<<"\nIngrese Valor Al Nodo "<<i+1<<" :";
cin>>etiqueta;
insertaAVL(&A,etiqueta);
}
system("clear");
}


void enOrden(AVL *A){
if(A!=NULL){
enOrden(A->izqda);
cout << A->elemento<< " ";
enOrden(A->drcha);
}
}

void preOrden(AVL *A){
if(A!=NULL){
cout << A->elemento <<" ";
preOrden(A->izqda);
preOrden(A->drcha);
}
}

void postOrden(AVL *A){
if(A!=NULL){
postOrden(A->izqda);
postOrden(A->drcha);
cout << A->elemento << " ";
}
}

void verArbol(AVL *A, int n){
if(A==NULL)
return;
verArbol(A->drcha, n+1);
for(int i=0; i<n; i++)
cout<<" ";
cout<< A->elemento<<endl;
verArbol(A->izqda, n+1);
}


int Mostrar(){
printf("\n\t\tMOSTRANDO RECORRIDO DEL ARBOL BINARIO DE BUSQUEDA (ABB)");
printf("\n\n\nMostrando Arbol Binario De Busqueda \n\n");
verArbol( A, 0);

printf("\nOrdenes Del Arbol Binario De Busqueda");

printf("\n\nEn-Orden : ");
enOrden(A);

printf("\n\nPost-Orden : ");
postOrden(A);

printf("\n\nPre-Orden : ");
preOrden(A);

return(0);


}


int main (){
int op1;
char op2='s';
while ((op2=='s')||(op2=='S'))
{
printf("\n\n\n\n\n\n\t\t\tMENU DE ARBOL BINARIO DE BUSQUEDA (ABB)");
printf("\n\n\t\t\t-> Ingrese 1 Para Agregar Informacion");
printf("\n\t\t\t-> Ingrese 2 Para Recorrer ABB");
printf("\n\t\t\t-> Ingrese 3 Para Buscar");
printf("\n\t\t\t-> Ingrese 4 Para Eliminar");
printf("\n\t\t\t-> Ingrese 5 Para Salir");
printf("\n\n\t\t\t -> Ingrese Opcion : ");
scanf("%d",&op1);
system("clear");
switch(op1)
{
case 1:
ingreManual();
break;

case 2:
Mostrar();
break;

case 3:

break;

case 4:

break;

case 5:

break;

default:
printf("\n\nLa Opcion Ingresada No Existe En El Menu Del Arbol Binario De Busqueda:\n" "");
break;
}
printf("\n\n\n\n\n\tDesea Regresar Al Menu Del Arbol Binario De Busqueda ...s/n?:"" ");
cin>>op2;
system("clear");
if((op2=='n')||(op2=='N'))
printf("\n\n\n\n\n\n\n\n\t\tPresione ENTER para Cerrar La Consola De Ejecucion");
}
}

EL MENU por el momento es solo para saber que estoy agregando despues se lo tengo que quitar y unir el ABB y AVL para que funcione como uno solo pero primero necesito el lector porque sino, no estoy haciendo nada
  #8 (permalink)  
Antiguo 15/03/2014, 00:05
 
Fecha de Ingreso: marzo-2014
Mensajes: 6
Antigüedad: 10 años, 8 meses
Puntos: 0
Respuesta: Lectura de Comandos desde un TXT

eee... buenas hoy me di cuenta de un problema que son estos:

struct arbol{
int Elemento; AQUI HAY UNO EN EL ANTERIOR ESTA EN CHAR Y TIENE QUE
TENER INT
struct arbol *Izq;
struct arbol *Der;
};

arbol *t = NULL;


// Funcion Para Agregar Al ABB
void Insertabb(struct arbol **t, int Etiqueta){ ESTA PARTE TAMBIEN ESTA EN CHAR PERO ES
INT

jejeje como tengo varias copias para prueba y error no me di cuenta cual les mande pero el AVL esta bien el ABB es donde esta el problema
  #9 (permalink)  
Antiguo 15/03/2014, 06:16
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 3 meses
Puntos: 83
Respuesta: Lectura de Comandos desde un TXT

Lo que necesitas es un parser, puedes usar alguno que ya exista; puede que puedas adaptar el parser a tu formato, o puede que debas adaptar tu formato al parser. La otra opcion es crear tu propio parser, pero ten en cuenta que puede llegar a ser mas complejo de lo que puedas imaginar :)

Te pongo un ejemplo muy simple que puede ayudarte a seguir con esto. Primero el archivo de comandos:

Código C:
Ver original
  1. Begin
  2. Create(1,2,3,4,5,A)
  3. Delete(0)
  4. Create(6,7,8,9,0,B)
  5. End

Si nos basamos en el archivo lo que harias manualmente sería: identificar el 'Begin' y en 'End', sacar lo que hay enmedio, separar por lineas de comando, y para cada linea de comando indentificar la operacion (en este caso 'Create' o 'Delete'), y para cada operacion evaluar el contenido.

Lo primero es identificar los bloques de acciones. Declaramos una lista global de etiquetas de trabajo:

Código C:
Ver original
  1. enum LTAGS {
  2.     TAG_BEGIN,
  3.     TAG_END,
  4.     TAG_CREATE,
  5.     TAG_DELETE,
  6.     TAG_COUNTER
  7. };
  8. static char *STAGS[TAG_COUNTER] = {
  9.     "Begin",
  10.     "End",
  11.     "Create",
  12.     "Delete"
  13. };
  14. #define TAG_UNDEFINED       -1

Ahora declaramos un flag de estado:

Código C:
Ver original
  1. unsigned char flag_reading_block = 0;

Esto nos indica si estamos dentro de un bloque 'Begin - End', lo inicio a 0 para indicar que no estoy dentro de ningun bloque. Si estamos dentro de un bloque podemos evaluar las acciones, si no pues se omiten o se avisa de un error en el formato (lo que sea). Para el funcionamiento cuando encuentre un comando 'Begin' cambiaré el flag a 1, y cuando encuentre 'End' le asignaré 0, no tiene mas complicacion.

Ahora ya podemos leer el archivo linea por linea:

Código C:
Ver original
  1. FILE *arx;
  2. char line[1024];
  3.  
  4. arx = fopen("test.txt", "r");
  5.  
  6. while(fgets(line, 1023, arx) != NULL) {
  7.     //tengo una linea de comando
  8. }

Ya tengo las lineas, pero debo evaluar que significan. Para eso tengo la lista de etiquetas que defini al principio. Me creo una funcion auxiliar para averiguar que etiqueta corresponde al comando de la linea:

Código C:
Ver original
  1. int get_tag(char *line) {
  2.     int q;
  3.  
  4.     for(q = 0; q < TAG_COUNTER; q++) {
  5.         if(!strncmp(line, STAGS[q], strlen(STAGS[q]))) {
  6.             return q;
  7.         }
  8.     }
  9.  
  10.     return TAG_UNDEFINED;
  11. }

Esta funcion 'get_tag' no hace nada mas que buscar el inicio del comando en la lista de etiquetas. Te repito que esto es un ejemplo simple, y por eso se puede simplificar de esta forma.

En principio segun el funcionamiento de get_tag es necesario trimar los espacios iniciales de la cadena de comandos (espacios, tabuladores, saltos de linea). En el archivo de comandos de ejemplo no tengo ni espacios ni tabuladores, con lo que no me hara falta trimar.

Ahora para cada linea se que operacion debo ejecutar, pues solo tengo que implementar un switch para diferenciar:

Código C:
Ver original
  1. switch(get_tag(line)) {
  2.     case TAG_BEGIN: {
  3.         if(!flag_reading_block) {
  4.             flag_reading_block = 1;
  5.         }
  6.     }
  7.     break;
  8.     case TAG_END: {
  9.         if(flag_reading_block) {
  10.             flag_reading_block = 0;
  11.         }
  12.     }
  13.     break;
  14.     case TAG_CREATE: {
  15.         if(flag_reading_block) {
  16.             exec_create(line);
  17.         }
  18.     }
  19.     break;
  20.     case TAG_DELETE: {
  21.         if(flag_reading_block) {
  22.             exec_delete(line);
  23.         }
  24.     }
  25.     break;
  26. }

No hay ningun misterio en eso, hasta aqui todo ok?

Ahora solo falta implementar la funcion exec_create y exec_delete, y todas las demas funciones para las acciones que quieras soportar. Implemento la de exec_create: sabes que la operacion Create es del tipo 'Create(datos)'. Esto significa que quieres recuperar solo lo que hay entre los parentesis. Haces un sscanf quitando el nombre de la accion y los parentesis y ya tienes los datos:

Código C:
Ver original
  1. void exec_create(char *line) {
  2.     char data[512];
  3.     int q;
  4.     char *pch;
  5.  
  6.     memset(data, 0, sizeof(data));
  7.     if(sscanf(line, "Create(%511[^)]", data) > 0) {
  8.         //ya tengo los datos
  9.     }
  10. }

Ahora en 'data' ya tienes los datos "1,2,3,4,5,A". Lo unico que te falta es tokenizar por comas y añadir al arbol.

Algo parecido harias para el 'Delete' y para las demas acciones que vayas a implementar.

Espero que te sea de ayuda
Saludos
vosk

Etiquetas: comandos, lectura, numero, txt
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:30.