Agenda de contactos

Alba Gállego Marín

/* Partiendo del pequeño fichero con tres contactos que subí el otro día y tras muchos intentos de que funcionase, aquí dejo por fin una agenda de contactos con tres opciones: añadir, visualizar, y borrar. */

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

struct contacto
    {
        char nombre[20];
        int telefono;
        char ciudad[20];
    };

typedef struct contacto Contacto;

 void meterContactosNuevos()
    {

    Contacto primero, segundo, tercero;

    printf ("\n\nIntroduce los datos del primer contacto (nombre telefono ciudad): \n");
    scanf ("%s %d %s", &primero.nombre, &primero.telefono, &primero.ciudad);
    printf ("\nSegundo contacto:\n");
    scanf ("%s %d %s", &segundo.nombre, &segundo.telefono, &segundo.ciudad);
    printf ("\nTercer contacto: \n");
    scanf ("%s %d %s", &tercero.nombre, &tercero.telefono, &tercero.ciudad);

    printf ("\nLos nuevos contactos son: \n");
    printf ("\nNOMBRE\t\tTELEFONO\t\tCIUDAD");
    printf ("\n%s\t\t%d\t\t%s", primero.nombre, primero.telefono, primero.ciudad);
    printf ("\n%s\t\t%d\t\t%s", segundo.nombre, segundo.telefono, segundo.ciudad);
    printf ("\n%s\t\t%d\t\t%s", tercero.nombre, tercero.telefono, tercero.ciudad);

    printf ("\n\nEstos datos se han almacenado en el nuevo fichero contactos.txt. \n(Revisa tu carpeta). \n\n");

    FILE *pf;

    pf=fopen ("contactos.txt", "w+");

    fprintf (pf, "\t\tAGENDA DE CONTACTOS\n");
    fprintf (pf, "\nNOMBRE\t\tTELEFONO\t\tCIUDAD");
    fprintf (pf, "\n%s\t\t%d\t\t%s", primero.nombre, primero.telefono, primero.ciudad);
    fprintf (pf, "\n%s\t\t%d\t\t%s", segundo.nombre, segundo.telefono, segundo.ciudad);
    fprintf (pf, "\n%s\t\t%d\t\t%s", tercero.nombre, tercero.telefono, tercero.ciudad);

    fclose(pf);
    }

    void meterContactosMas ()
    {
        Contacto primero;

    printf ("\n\nIntroduce los datos del nuevo contacto (nombre telefono ciudad): \n");
    scanf ("%s %d %s", &primero.nombre, &primero.telefono, &primero.ciudad);

    printf ("\nEl nuevo contacto es: \n");
    printf ("\nNOMBRE\t\tTELEFONO\t\tCIUDAD");
    printf ("\n%s\t\t%d\t\t%s", primero.nombre, primero.telefono, primero.ciudad);

    printf ("\n\nEstos datos se han almacenado en tu fichero contactos.txt. \n(Compruebalo). \n\n");

    FILE *pf;

    pf=fopen ("contactos.txt", "r+");

    fseek (pf, 0, SEEK_END);

    fprintf (pf, "\n%s\t\t%d\t\t%s", primero.nombre, primero.telefono, primero.ciudad);
    fclose(pf);
    }

    void leerContactos ()
    {
        FILE *pf;
        char c;

        pf=fopen ("contactos.txt", "r");
        printf ("\n");
        while(feof(pf)==0)
        {
         c=getc(pf);
         putchar(c);
        }
        putchar('\n');
        fclose(pf);
        printf ("\n\n");
    }

     void borrarContacto ()
    {
        int l, linea, NUMlineas=0;
        char LINEA[MAX], c, ch;
        FILE *destino, *pf;
        printf ("\nTu lista de contactos es la siguiente: \n");
        leerContactos ();

        printf ("Introduce el numero de contacto que quieres borrar (linea): ");
        scanf ("%d", &l);

        linea=l+3;

        pf=fopen ("contactos.txt", "r+");
        destino=fopen ("contactos2.txt", "w+");

        /*Leemos todas las lineas del archivo*/
      while (fgets (LINEA, MAX, pf)!=NULL)
        {
            if ((ch=getc(pf))!= EOF)
            ungetc(ch, pf);
            NUMlineas++;
            if (NUMlineas!=linea)
            {
                fputs(LINEA, destino);
            }
        }

        printf ("\nEl contacto ha sido eliminado. Revise su archivo.\n");
        fclose(pf);
        fclose(destino);
        remove ("contactos.txt");
        rename ("contactos2.txt", "contactos.txt");

    }

    int main ()
    {
        int opcion;
        FILE *pf;

        pf=fopen ("contactos.txt", "r");

        printf ("\t\tBIENVENIDO A TU AGENDA DE CONTACTOS\n\n");
        printf ("1. Introducir nuevo contacto.\n2. Ver contactos.\n3. Borrar contacto.\n\nIndica la opcion que desees: ");
        scanf ("%d", &opcion);
        switch (opcion)
        {
            case 1:
                {if (pf==NULL)
                {
                fclose(pf);
                printf ("\nTu agenda de contactos esta vacia. Vamos a introducir tus 3 primeros contactos.\n");
                meterContactosNuevos();}
                else
                {
                fclose(pf);
                printf("\nTu agenda ya tiene algunos contactos. Vamos a introducir uno nuevo.\n");
                meterContactosMas();}}
            break;

            case 2:
                {if (pf==NULL)
                {
                fclose(pf);
                printf ("\nLo siento, tu agenda de contactos esta vacia.\n\n");
                }
                else
                {
                fclose(pf);
                leerContactos();}
                }
            break;

            case 3:
                {if (pf==NULL)
                {
                 fclose(pf);
                printf ("\nLo siento, tu agenda de contactos esta vacia.\n\n");
                }
                else
                {
                fclose(pf);
                borrarContacto();
                }
                }
            break;

            default:
            {fclose(pf);
                printf ("\nLa opcion seleccionada no es valida\n.");}
        }

        return 0;
    }
Anuncios
Esta entrada fue publicada en Informática e Internet. Guarda el enlace permanente.

3 respuestas a Agenda de contactos

  1. very good!!

    UN DETALLE: en la función borraContacto(), en el bucle while()
    ¿cuál es el papel de las líneas 106 y 107? ¿Son realmente necesarias?.

  2. Mi intención era que contara una nueva línea al comienzo de esta… pero acabo de probar el programa de nuevo eliminando esas dos líneas de código, ¡y la verdad es que parece que sigue funcionando a la perfección!

  3. Esa impresión da, más que nada porque lo que haces es chequear si ha llegado a final de fichero pero no usas para nada ese chequeo (la variable ch). Después (línea 107) echas para atrás el cursor la posición avanzada en la lectura anterior (línea 106). Todo queda igual después de líneas 106-107 por eso a primera vista parecen innecesarias.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s