/
Inicio :: Foros

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

guardar palabras en txt hacia abajo

 
      Í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: 09/09/2007 1:39 pm
Título: guardar palabras en txt hacia abajo

ojala q me entiendas por favor xq de verdad necesito hacer esto......no te preocupes por los errores q me emencionaste xq ya los corregi......lo q necesito hacer no es q el usuario se limite a ingresar una palabra si no q cada ves q las ingrese queden listadas hacai abajo

por ejemplo cuando el usuario ingresa varias palabras una a una me van quedando guardas en el archivo de texto todas hacia el lado. de la siguiente forma:

cristian tarea juego perro.........y haci

yo necesito q cuando se abra el archivo de texto donde uno guardo las palabras me queden hacia abajo de esta forma:

cristian
tarea
juego
perro

xq lo q me pasa es q despues tengo q hacer un eliminar donde el usuario ingresa la palabra que desea eliminar y se borre del archivo de texto

ojala q me puedas decir como puedo hacer esto....xq creo q hay comparando la palabra que el usuario ingresa con las palabaras que tengo guardas.....pero no se bien como hacer eso en C

ojala q me ayudes respondiendome en codigo...........de antemano muchas gracias

Código:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#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]!=NULL)
{
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_);

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
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 09/09/2007 2:30 pm
Título:

Por favor no sigas abriendo temas nuevos, en su lugar responde en los ya existentes (con este van tres sobre el mismo programa).

En tu programa imprimes la informacion en el archivo utilizando la funcion fputs:
Código:
fputs(aux->caracteres, f_);

A diferencia de puts que imprime el caracter '\n' de forma automatica despues de la cadena que recibe como argumento la funcion fputs no lo hace, si queremos que la informacion que se imprima con esa funcion este en lineas separadas debemos imprimir nosotros ese caracter manualmente.

En otras palabras imprime mediante "fputc('\n', f_)" ese caracter despues de la llamada a fputs o utiliza "fprintf(f_, "%s\n", aux->caracteres)" en su lugar.

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
crissepul



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

MensajePublicado: 11/09/2007 5:50 pm
Título: no me resulta

aunque segui tus pasos me sigue ingresando una palabra al lado de la otra......a q se debe intente de todas formas con \n pero no hay caso...ingreso una palabra esta se guarada en el txt despues ingreso y esta se guarda tambien en el txt pero me la sigue ingresando al lado yo quiero q la seguna palabra me la ingrese abajo
Volver arriba
crissepul



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

MensajePublicado: 11/09/2007 6:18 pm
Título:

ahora si al cololcar

Código:
fputs(strcat(aux->caracteres,\n),f_);


me guarda las palabras con doble salto de linea...pero yo solo lo necesito con un salto de linea....no veo xq lo hace sera q el codigo en otra parte me esta guardando mal las palabras ayuda por favor
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 11/09/2007 8:53 pm
Título:

crissepul escribió:
aunque segui tus pasos me sigue ingresando una palabra al lado de la otra......a q se debe

En buen plan: ¿Como esperas que alguien pueda responder a eso sin ver el codigo fuente de tu programa?

Tal vez alguien pueda ayudarte en los foros pero antes necesitas publicar el codigo fuente completo y funcional de tu programa.

De otra forma son solo adivinazas ...

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
DCelso



Registrado: 28 Abr 2004
Mensajes: 112

MensajePublicado: 13/09/2007 11:52 am
Título:

Creo recordar que si abres el archivo con "wt", cuando usas fprintf el "\n" se interpreta como retorno de carro y nueva línea, en cambio cuando lo abres como "wb" no, cosa que no es tu caso así que debería de guardarse bien el fichero. Quizas el fput no funcione así y tengas que insertar un "\n" y un "\r".
Prueba a ver
Bueno, aqui te dejo una prueba que he hecho basándome en la nomenclatura de tu código. No he podido salvar mucho, lo siento.
El algoritmo consiste en usar una lista enlazada para almacenar las palabras, la cual se creará al iniciar la aplicación con la información del archivo. El usuario trabajará sobre esta lista para añadir o eliminar, y al cerrarse la aplicación se guardará en el mismo archivo con las modificaciones que haya hecho.

He puesto nombres largos descriptivos a las variables, la lástima es tener que usar c, con c++ quedaría un poco mas claro, si quieres ver la diferencia coméntamelo y readacto el código.

Saludos, ya me contarás si te vale.

Código:

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

#define largo_n 25

typedef struct s_palabra
{
        char caracteres[largo_n];
        struct s_palabra *sig;
}
palabra;


void ingresar_palabra();
void ingresar_palabra_en_diccionario( char caracteres[largo_n]);
void eliminar_palabra();
void eliminar_palabra_del_diccionario( char caracteres[largo_n]);

int cargar_diccionario();
void guardar_diccionario();
void elmininar_memoria_diccionario();

palabra * diccionario=NULL;

int main(int argc , char* argv[])
{
        cargar_diccionario();
        int opcion;
        printf("\nMENU PRINCIPAL");
        do {
                printf("\n\n .1 Ingresar palabra");
                printf("\n .2 Eliminar palabra");
                printf("\n .3 Salir");
                printf("\n\nIngrese su opcion: ");
                fscanf(stdin,"%d", &opcion);
                fflush(stdin);
                switch(opcion) {
                case 1:
                        ingresar_palabra();
                        break;
                case 2:
                        eliminar_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);
        guardar_diccionario();
        elmininar_memoria_diccionario();
        return 0;
}

int cargar_diccionario()
{
        int retorno = 1;
        FILE *f_;
        char caracteres[largo_n];

        f_ = fopen("dictionary.txt","rt");
        if(f_==NULL) {
                printf("error en el archivo");
                retorno =0;
        } else {
                while (!feof(f_)) {
                        fscanf(f_,"%s\n",&caracteres[0]);
                        ingresar_palabra_en_diccionario(caracteres);
                }
                fclose(f_);
        }
        return retorno;
}

void ingresar_palabra()
{
        char caracteres[largo_n];
        printf("Escriba la palabra que desea ingresar: " );
        fscanf(stdin,"%s",caracteres);
        ingresar_palabra_en_diccionario(caracteres);
        fflush(stdin);
}

void ingresar_palabra_en_diccionario( char caracteres[largo_n] )
{
        palabra * ultima_palabra=diccionario;
        palabra * nueva= (palabra *)malloc(sizeof(palabra));
        strcpy(nueva->caracteres,caracteres);
        nueva->sig=NULL;
        if (ultima_palabra !=NULL) {
                while (ultima_palabra->sig!=NULL) {
                        ultima_palabra=ultima_palabra->sig;
                }
                ultima_palabra->sig=nueva;
        } else {
                diccionario=nueva;
        }
}

void eliminar_palabra()
{
        char caracteres[largo_n];
        printf("Escriba la palabra que desea eliminar: " );
        fscanf(stdin,"%s",caracteres);
        eliminar_palabra_del_diccionario(caracteres);
        fflush(stdin);
}

void eliminar_palabra_del_diccionario( char caracteres[largo_n] )
{
        palabra *puntero_palabras=diccionario;
        palabra * palabra_para_borrar=NULL;
        int encontrado=0;
        if (puntero_palabras !=NULL) {
                do {
                        if (strcmp(puntero_palabras->caracteres,caracteres)==0) {
                                palabra_para_borrar=puntero_palabras;
                                encontrado=1;
                        }
                        puntero_palabras=puntero_palabras->sig;
                } while (puntero_palabras!=NULL && encontrado==0);
                if (encontrado==1) {
                        palabra *puntero_palabras=diccionario;
                        while (puntero_palabras->sig!=palabra_para_borrar) {
                                puntero_palabras=puntero_palabras->sig;
                        }
                        puntero_palabras->sig=palabra_para_borrar->sig;
                        free(palabra_para_borrar);
                        printf("Palabra eliminada.\n");
                } else {
                        printf("Palabra no encontrada.\n");
                }
        }
}



void guardar_diccionario()
{
        FILE *f_;
        palabra * puntero_palabras=diccionario;

        f_ = fopen("dictionary.txt","wt");
        if(f_==NULL)
                printf("error en el archivo");

        if (puntero_palabras !=NULL) {
                do {
                        fprintf(f_,"%s\n",puntero_palabras->caracteres);
                        puntero_palabras=puntero_palabras->sig;
                } while (puntero_palabras!=NULL);
        }
        fclose(f_);
}

void elmininar_memoria_diccionario()
{
        palabra * puntero_palabras=diccionario;
        palabra * palabra_para_borrar;
        if (puntero_palabras !=NULL) {
                do {
                        palabra_para_borrar=puntero_palabras;
                        puntero_palabras=puntero_palabras->sig;
                        free (palabra_para_borrar);
                } while (puntero_palabras!=NULL);
        }
}



NOTA: es posible hacerle mejoras, actualmente no comprueba si existe la palabra a insertar, es decir, se puede meter las veces que quiera, y otra es que al eliminar solo se eliminaría la primera ocurrencia de la palabra.
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