/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

ingresar palabra a .txt

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
crissepul



Registrado: 10 Abr 2007
Mensajes: 14
Ubicación: la granja

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com