elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en agenda con ficheros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Problema en agenda con ficheros  (Leído 8,656 veces)
DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Problema en agenda con ficheros
« en: 7 Febrero 2012, 23:05 pm »

Hola.

Haciendo un ejercicio me he encontrado una duda.

Es este:

Código
  1. /*Una agenda que maneje los siguientes datos: nombre, dirección, tlf móvil, email, y día,
  2. mes y año de nacimiento (estos tres últimos datos deberán ser números enteros
  3. cortos). Deberá tener capacidad para 100 fichas. Se deberá poder añadir un dato
  4. nuevo, visualizar los nombres de las fichas existentes, o mostrar todos los datos de una
  5. persona (se preguntará al usuario cual es el nombre de esa persona que quiere
  6. visualizar). Al empezar el programa, leerá los datos de un fichero llamado “agenda.dat”
  7. (si existe). Al terminar, guardará todos los datos en ese fichero.*/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12.  
  13. int main()
  14. {
  15.    struct
  16.    {
  17.      char nombre[10];
  18.      char direccion[15];
  19.      int movil;
  20.      char email[20];
  21.      short int dia, mes, ano;
  22.    }datos[100];
  23.    char lineas[500];
  24.    FILE* fichero;
  25.    int opcion;
  26.  
  27.    fichero = fopen("agenda.dat", "rt");
  28.    if(fichero != NULL)
  29.    {
  30.  
  31.    while(! feof(fichero)) //Leemos los datos que contiene al principio
  32.    {
  33.      fgets(lineas,25,fichero);
  34.    }
  35.    fclose(fichero);
  36.  
  37.    printf("Elija una opcion\n");
  38.    printf("1. Introducir datos\n");
  39.    printf("2. Visualizar nombres de las fichas existentes\n");
  40.    printf("3. Mostrar todos los datos de una persona\n");
  41.    scanf("%d",&opcion);
  42.  
  43.    switch(opcion)
  44.    {
  45.      case 1:
  46.           //En construcción, lo editaré según las respuestas que obtenga al preguntaros.
  47.           break;
  48.      case 2:
  49.           //En construcción, lo editaré según las respuestas que obtenga al preguntaros.
  50.           break;
  51.      case 3:
  52.           //En construcción, lo editaré según las respuestas que obtenga al preguntaros.
  53.           break;
  54.      default:
  55.              printf("Opcion no valida");
  56.    }
  57.    }
  58.  
  59.  
  60.  
  61.  
  62.    system("pause");
  63.    return 0;
  64. }
  65.  
  66.  

La idea que estoy siguiendo es que primero abro el archivo en modo de lectura. Entonces pongo los casos en los que tiene que leer el archivo, y los casos en los que no. Cierro el archivo.

Después, creo un switch, en el que elijo una de las tres opciones, y ahí planteo cada cosa.

Y, finalmente, abro de nuevo el archivo, pero esta vez para escribir, y meto los datos obtenidos en el switch.

Mi problema es que no sé cómo hacer para que al cerrar el programa y volver a abrirlo sepa que ya he metido un número determinado de fichas (no sé si me explico). Creo que solo es con un do-while en el switch de "añadir datos", sumándole uno a "i", pero no estoy seguro.

También me gustaría saber si veis bien como he planteado el problema, para ver cómo puedo cambiar las cosas.

Muchísimas gracias.

Saludos.


En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #1 en: 7 Febrero 2012, 23:11 pm »

Si la idea del contador es que funcione siempre y cuando mantengas la cuenta al abrir y cerrar el programa, lo que necesitas es algún modo de almacenarlo externamente. Si usas un contador en el programa, en memoria, se borrará ese dato al cerrar el programa.
Ahora bien, puedes usar otro archivo para guardar el dato de la cantidad de fichas (supongo que al hacer este ejercicio sabes algo de manejo de archivos). Entonces, al abrir el programa, deberás leer este archivo que contiene el contador y listo, empiezas de vuelta la cuenta desde donde quedaste la última vez.

Ahora bien, no entiendo exactamente lo que quieres lograr con esto:

Código
  1. while(! feof(fichero)) //Leemos los datos que contiene al principio
  2.    {
  3.      fgets(lineas,25,fichero);
  4.    }
  5.    fclose(fichero);


En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #2 en: 7 Febrero 2012, 23:18 pm »

Pretendo que mientras el fichero no llegue a su fin, lea todas sus líneas (pero por cómo has reaccionado, me parece que voy a tener que quitarlo, seguramente esté mal...).

No había caído en que debía almacenar el resultado de "i++" en un fichero.

Muchas gracias.

Saludos.
En línea

eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #3 en: 7 Febrero 2012, 23:26 pm »

Citar
Mi problema es que no sé cómo hacer para que al cerrar el programa y volver a abrirlo sepa que ya he metido un número determinado de fichas (no sé si me explico). Creo que solo es con un do-while en el switch de "añadir datos", sumándole uno a "i", pero no estoy seguro.

Si con "cerrar al programa" te refieres a darle clic a la "cruz roja" matando el proceso, lógicamente no puedes hacer nada con variables porque se almacenan en la RAM que es una memoria volátil. En este caso debes leer el fichero y comprobar el número de contactos que hay (cada vez que leas un nombre sumas uno al contador hasta llegar al final, asi calcularás el número de elementos ya guardados).

Pero, si lo que quieres decir es después de guardar un contacto, es tan sencillo como un contador... y en el bucle que te va imprimiendo el menú pones como condición de continuación "contador < 100".

Tu código está hecho a base de librerías standard, queda feo que lo destroces con "system("pause")", aunque en general su uso no es correcto. Pon cualquier instrucción de lectura del teclado para pausar el programa.

Saludos.
« Última modificación: 7 Febrero 2012, 23:29 pm por eleon » En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #4 en: 7 Febrero 2012, 23:32 pm »

Muchas gracias a los dos. Ahora me tengo que ir ya, pero ya mañana termino el programa y dejo mi código completo.

Saludos.
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #5 en: 7 Febrero 2012, 23:34 pm »

Pretendo que mientras el fichero no llegue a su fin, lea todas sus líneas (pero por cómo has reaccionado, me parece que voy a tener que quitarlo, seguramente esté mal...).

Jaja, no reaccioné mal, sólo preguntaba porque no entiendo el por qué de cerrar el archivo justo después de las lecturas.
Quizás dependa de lo que pretendas hacer en las 3 opciones, pero ¿No sería mejor abrir el archivo para lectura y escritura y cerrarlo antes de terminar el programa? Es decir, abrir y cerrar una única vez.
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #6 en: 8 Febrero 2012, 15:18 pm »

¿Entonces está bien esto?

Código
  1. while(! feof(fichero)) //Leemos los datos que contiene al principio
  2.    {
  3.      fgets(lineas,25,fichero);
  4.    }
  5.    fclose(fichero);

Lo hago por partes (me refiero a lo de abrir y cerrar el fichero para escribir/leer) porque en el manual que estoy siguiendo en la parte que hay antes del ejercicio no viene nada de cómo hacer las dos cosas (aunque he visto que viene justo después, pero bueno).

Ahora me voy a poner a terminar el programa.

Gracias.

Saludos.
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #7 en: 8 Febrero 2012, 15:34 pm »

Mira, lo que haces con esa parte del code es leer todas las líneas, llegar al final del archivo, y después cerrarlo. Yo no le veo utilidad así como está!
En línea

DickGumshoe


Desconectado Desconectado

Mensajes: 480



Ver Perfil WWW
Re: Problema en agenda con ficheros
« Respuesta #8 en: 8 Febrero 2012, 21:08 pm »

¿Al cerrar el fichero "se van" los datos obtenidos con ese fgets del programa?
En línea

do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Problema en agenda con ficheros
« Respuesta #9 en: 8 Febrero 2012, 21:21 pm »

¡Buenas!

Supongo que la lectura/escritura en el fichero sera en binario. Si vas aumentando el tamaño del fichero segun vas metiendo datos, lo estaras haciendo de forma que añada bloques del tamaño del struct que utilizas. Por lo tanto, para saber cuantos elementos tienes en un momento dado solo tendras que calcular la longitud del fichero y dividirla por el tamaño del tipo de dato que guarda:

Código
  1.  
  2. FILE *f;
  3. unsigned long posicion, tamanio, ndatos;
  4.  
  5. f = fopen(tu_archivo,"rb");
  6.  
  7. /* las instrucciones que quieras */
  8.  
  9. /* leemos la posicion actual del fichero */
  10. posicion = ftell(f);
  11.  
  12. /* nos situamos al final del fichero */
  13. fseek(f,0,SEEK_END);
  14.  
  15. /* leemos el numero de bytes que tiene el fichero */
  16. tamanio = ftell(f);
  17.  
  18. /* volvemos a dejarlo como estaba */
  19. fseek(f,posicion,SEEK_SET);
  20.  
  21. /* si el fichero solo contiene un tipo de datos esta division siempre sera exacta */
  22. ndados = tamanio / sizeof(tu_struct);
  23.  

¡Saludos!
¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema programando una agenda
Java
Fastolfe 2 4,194 Último mensaje 17 Marzo 2011, 16:02 pm
por Fastolfe
Problema al hacer una Agenda Telefonica en C++ « 1 2 »
Programación C/C++
Y2J 10 17,312 Último mensaje 19 Agosto 2011, 18:21 pm
por Y2J
problema con ejercicio de agenda con punteros
Programación C/C++
attackers 3 5,245 Último mensaje 17 Noviembre 2011, 04:41 am
por attackers
agenda en c... problema con mostrar contactos y buscar contacto en especifico
Programación C/C++
attackers 7 6,226 Último mensaje 21 Noviembre 2011, 19:53 pm
por s00rk
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines