| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
crissepul
Registrado: 10 Abr 2007 Mensajes: 14 Ubicación: la granja
| Publicado: 06/09/2007 2:33 pm | | | Título: ingresar palabra a .txt |
| hola a todos tengo el siguiente problema: tengo que ingresar una palabra a un archivo txt, el problema es q cuando selecciono la opcion 1.... de ingresar el programa se cierra inmediatamente aqui les dejo el codigo y ojala me puedan ayudar
#define largo_n 25 #define largo_total 30
typedef struct { char caracteres[largo_n]; struct palabra *sig; } palabra; palabra *head_pal;
void guardar_palabra(char pala[largo_n]); void leer_palabra(char c[largo_total]); void libera_palabra(); void ingresar_palabra(); void Menu (); int texto(char w[largo_total]); char* texto_e(char w[largo_total]);
main() { int opcion; printf("\nMENU PRINCIPAL"); do{ printf("\n\n .1 Agregar palabra"); printf("\n .2 Eliminar palabra"); printf("\n .3 Salir"); printf("\n\nIngrese su opcion: "); scanf("%d", &opcion); switch(opcion) { case 1: libera_palabra(); ingresar_palabra(); break; }
if (opcion == 3) printf("\nUsted ha salido del sistema\n\n"); if (opcion < 1 || opcion > 3) { printf ("\nOpcion incorrecta... vuelva a intentarlo"); } } while(opcion != 3); }
void leer_palabra(char c[largo_total]) { char caracteres[largo_n]; char c_aux[50]; strcpy(c_aux,c);
int n; int i;
n = texto(c); for(i=0;i<n;i++){ caracteres[i]=c[i];} for(i=n;i<2*n;i++){ caracteres[i]=NULL;} strcpy(c,texto_e(c)); guardar_palabra(caracteres); }
int texto(char w[largo_total]) { int i; char w_aux[largo_n]; i=0; while(w[i]!=',') { w_aux[i] = w[i]; i++; } return i; } char* texto_e(char w[largo_total]) { int i; int j; int z; i=0; char w_aux[largo_total]; while(w[i]!=',') { i++; } i++; z=i; for(j=0;j<largo_total-i;j++) { w_aux[j] = w[i]; i++; } return w_aux; }
void guardar_palabra (char pala[largo_n]) { palabra *nueva_pal; nueva_pal = (palabra *)malloc(sizeof(palabra));
if(head_pal==NULL) { nueva_pal->sig = NULL; strcpy(nueva_pal->caracteres,pala); head_pal = nueva_pal; } else { palabra *aux; aux = head_pal;
while(aux->sig!=NULL) { aux=aux->sig; } strcpy(nueva_pal->caracteres,pala); nueva_pal->sig = NULL; aux->sig = nueva_pal; } }
void ingresar_palabra() { char caracteres[largo_n];
FILE *_f; char cadena[largo_total]; _f = fopen("dictionary.txt","rt"); if(_f==NULL){printf("error en el archivo");} while(fgets(cadena,largo_total,_f)!=NULL) { leer_palabra(cadena); } fclose(_f); printf("Escriba la palabra que desea ingresar:" ); gets(caracteres);gets(caracteres); guardar_palabra(caracteres);
FILE *f_;
f_ = fopen("dictionary.txt","wt"); if(f_==NULL) printf("error en el archivo");
palabra *aux; aux = head_pal;
while(aux!=NULL) { fputs((aux->caracteres),f_); if(aux->sig == NULL){fputs(strcat(aux->caracteres,","),f_);} else{fputs(strcat(aux->caracteres,",\n"),f_);} aux = aux->sig; } fclose(f_); }
void libera_palabra() { palabra *aux_head_pal; aux_head_pal = head_pal; if(head_pal!=NULL) { while(head_pal->sig!=NULL) { head_pal = head_pal->sig; free(aux_head_pal); aux_head_pal = head_pal; } head_pal=NULL; free(head_pal); } } |
| | Volver arriba | |  | digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 06/09/2007 3:43 pm | | | Título: |
| mmm...
Para editar el código utiliza [Code]tu código[/ code] para que podamos entenderlo mejor.
Te olvidaste de incluir los archivos de cabecera, la terminación normal del programa al final del main principal, y una pausa para que se pueda visualizar.
Un saludo. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 07/09/2007 9:15 pm | | | Título: |
| | crissepul escribió: | | hola a todos tengo el siguiente problema: |
Cuando tengas problemas con uno de tus programas es muy importante que indiques el lenguaje de programacion que estas utilizando.
En el caso de que este sea C ...
Lo primero que falta son los archivos de inclusion como stdio.h.
El programa tiene bastantes deficiencias, al seleccionarse la unica opcion (agregar palabra) se llama primero a la funcion "libera_palabra", esta funcion esta bien salvo que al final del bucle colocas el puntero a NULL y despues tratas de liberarlo mediante free cuando deberia ser al reves:
| Código: | void libera_palabra() { palabra *aux_head_pal; aux_head_pal = head_pal; if (head_pal != NULL) { while (head_pal->sig != NULL) { head_pal = head_pal->sig; free(aux_head_pal); aux_head_pal = head_pal; } /* esto */ head_pal = NULL; free(head_pal); /* ** deberia ser ** ** free(head_pal); ** head_pal = NULL; */ } } |
Despues de esto se llama a la funcion "ingresar_palabra" que a su vez llama a la funcion "leer_palabra" y esta ultima realiza dos llamadas a funcion mal implementadas: "texto" y "texto_e".
1) Los problemas con la funcion "texto":
* Los arrays que almacenan las cadenas siendo procesadas tienen una capacidad distinta: largo_total es 30 mientras que largo_n es 25.
* Si la cadena almacenada en "w" no contiene un caracter ',' se entra en un ciclo infinito.
* El array "w_aux" no tiene funcion ya que se almacenan ahi los caracteres anteriores al caracter ',' pero no se utilizan posteriormente.
2) La funcion "texto_w" es donde seguramente se genera el error:
* De nuevo si la cadena "w" no contiene un ',' se genera un bucle infinito.
* A la variable "z" se le asigna un valor pero no se utiliza posteriormente.
* El segundo bucle copia los caracteres de "w" posteriores a la primera ',' en "w_aux" pero no se termina la cadena agregando el caracter '\0'.
* El valor de retorno de esta funcion es la direccion en memoria donde se almacena una variable local (el array "w_aux"), esto no es correcto ya que al terminar la funcion este espacio en memoria se libera y puede utilizarse para lo que sea, en el peor de los casos debes declarar esa variable como estatica para evitar que el programa reviente.
Tal vez el programa tenga otros errores pero solo lo revise superficialmente.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |