[ Foro de C ]

duda con posicionamiento con fseek

04-Nov-2009 23:40
Roberto rrs
4 Respuestas

Hola.
Tengo la siguiente duda, tengo este struct para el programa de la agenda y cuando leo la longitud de una ficha con ftell me pone que la longitud es de 96 posiciones.
Mi duda es ¿como están repartidas?
Me imagina que las primeras noventa son las 30+30+30 del nombre, dirección y móvil; pero ¿y las otras seis que son dos para día, dos para mes y dos para año?.


struct
    { char nombre[30];
      char direccion[30];
      char movil[30];
      unsigned short dia;
      unsigned short mes;
      unsigned short anyo;
      } fichas[100];

Saludos.


05-Nov-2009 10:50
Jess S.

¡Hola!

Pues es como tú dices, ya que los short ocupan dos bytes en sistemas de 32bytes.

Yo hice pruebas para añadir fichas a un fichero binario con un programilla titulado binariospruebas1.c, que se lo envié adjunto a Mario Moreno en una contestación al tema "Duda ejercicio agenda con fwrite/fread".

Te recomiendo que lo veas, ya que funciona. Probablemente te abra los ojos en cuanto al uso de fseek, fred, fwrite ..., como me los abrió a mi cuando lo vi escrito en otro programa ajeno. Posteriormente lo he afinado, pero vale tal cual.

Saludos.


05-Nov-2009 11:06
Jess S.

¡Hola de nuevo!

Quise decir sistemas de 32 bits.

Saludos.


05-Nov-2009 16:17
Roberto rrs

Gracias Jesús por tu respuesta.
Despues de muchas horas ya he conseguido terminar el programa de la agenda.
Esta probado y funciona perfectamente, lo pongo para que veais que os parece, acepto sugerencias.
Saludos.

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

main ()
{
    struct
    { char nombre[30];
      char direccion[30];
      char movil[30];
      unsigned short dia;
      unsigned short mes;
      unsigned short anyo;
      } fichas[100];
int opcion, a, b, longitudFichero, tamanyoFicha=96;
char textoTemporal[30], agenda[30]="agenda.dat";


FILE* fichero;
fichero=fopen(agenda, "r+b");
do {

printf ("\n\nMENU:\n");
printf ("----------------------------------------------------------------------\n");
printf ("1.-Introducir ficha nueva\n");
printf ("2.-Visualizar los nombres de las fichas existentes\n");
printf ("3.-Mostrar todos los datos de una persona\n");
printf ("4.-Salir\n");
printf ("----------------------------------------------------------------------\n");
printf ("Elegir una opcion: ");
gets (textoTemporal);
sscanf (textoTemporal, "%d", &opcion);
printf ("\n\n");
switch (opcion)
{
      case 1: /*Introducir nueva ficha*/
     
              fseek (fichero, 0, SEEK_END);
              longitudFichero=ftell(fichero);
              a=longitudFichero/tamanyoFicha;
              do {          
              printf ("Introduce nueva ficha:\n\n");
              printf ("Introduce nombre: ");
              gets (fichas[a].nombre);
              if (strlen(fichas[a].nombre)==0) break;
             
              printf ("Introduce direccion: ");
              gets (fichas[a].direccion);
             
              printf ("Introduce movil: ");
              gets (fichas[a].movil);
             
              printf ("Introduce dia: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%2u", &fichas[a].dia);
             
              printf ("Introduce mes: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%2u", &fichas[a].mes);
             
              printf ("Introduce anyo: ");
              gets (textoTemporal);
              sscanf (textoTemporal, "%4u", &fichas[a].anyo);
              fwrite(&fichas[a], sizeof(fichas[a]) , 1, fichero);
             
              a++;
              }while (a!=100);
              if (a==100) printf ("YA SE HAN AGOTADO LAS 100 FICHAS");
              break;
      case 2: /*Visualizar los nombres de las fichas existentes*/
              a=0, b=0;
              fseek (fichero, 0, SEEK_END);
              longitudFichero=ftell(fichero);
              while (b<longitudFichero)
              { fseek (fichero, b, SEEK_SET);
                fread (&fichas[a].nombre, 1, 30, fichero);
                b+=tamanyoFicha;
                puts (fichas[a].nombre);}
               
             break;
      case 3: /*Mostrar todos los datos de una persona*/
             b=0, a=0;
             printf ("\n\nIntroduce el nombre de la ficha a mostrar: ");
             gets (textoTemporal);
             fseek (fichero, 0, SEEK_END);
             longitudFichero=ftell(fichero);
             while (b<longitudFichero)
               {fseek (fichero, b, SEEK_SET);
                fread (&fichas[a].nombre, 1, 30, fichero);
                if (strcmp (textoTemporal, fichas[a].nombre)==0)
                   {fseek (fichero, -30, SEEK_CUR);
                    fread (&fichas[a], 1, sizeof(fichas[a]), fichero);
                    printf ("Nombre: %s\n", fichas[a].nombre);
                    printf ("Direccion: %s\n", fichas[a].direccion);
                    printf ("Movil: %s\n", fichas[a].movil);
                    printf ("Fecha de nacimiento: %u-%u-%u\n", fichas[a].dia, fichas[a].mes, fichas[a].anyo);}
                b+=tamanyoFicha;
             }
             
              break;
      case 4: /*Salir*/
              printf ("FINAL DEL PROGRAMA");
              fclose(fichero);
              break;
     
      default: /*Opcion no valida*/    
               break;    
      }
} while (opcion!=4);
}

     


02-Jan-2010 12:43
mario moreno

Yo creo que el struct ya no hace falta que sea [100]. A mi me funciona igualmente. Aquí dejo el código:

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


   struct{
       char nombre[80];
       char direccion[80];
       char movil[80];
       char email[80];
       char fechanacimiento[80];
   }fichas;

   int main (void)

       {
           int opcion, i, longitudFichero, CantFichas;
           char textotemporal[81];
           char rutarchivo[80] = "/home/mario/Documentos/Programación/Agenda mejorada fseek/agenda.dat";
           char nombre[80];
           FILE* archivo;

           archivo = fopen("agenda.dat", "ab+");
           fclose(archivo);

           do{
           if ((archivo = fopen(rutarchivo, "rb")) == NULL){
           printf("\nNO SE HA ENCONTRADO EL ARCHIVO!!!");
           exit (1);
           }

           fseek(archivo, 0, SEEK_END);
           longitudFichero = ftell(archivo);
           CantFichas = longitudFichero/400;
           printf("\nLogintud del fichero: %d\n", longitudFichero);
           printf("\nNº de registros: (%d)\n", CantFichas);
           fclose(archivo);

           printf("\nTECLEE UNA OPCION");
           printf("\n-------------------");
           printf("\n1- Intruducir nuevo registro.");
           printf("\n2- Ver nombres de registros existentes.");
           printf("\n3- Mostrar datos de un registro.");
           printf("\n4- Salir.\n");
           printf("\nOpcion: ");
           gets(textotemporal);
           sscanf(textotemporal, "%d", &opcion);

           switch (opcion){
               case 1:         if (CantFichas < 100){
                               archivo = fopen("agenda.dat", "ab+");

                               printf("Introduzca un nombre: ");
                               gets(fichas.nombre);

                               printf("\nIntroduzca direccion: ");
                               gets(fichas.direccion);

                               printf("\nIntroduzca nº de movil: ");
                               gets(fichas.movil);

                               printf("\nIntroduce email: ");
                               gets(fichas.email);

                               printf("\nIntroduce fecha de nacimiento: ");
                               gets(fichas.fechanacimiento);
                               fwrite(&fichas, 1, sizeof(fichas),archivo);

                               printf("\nPulse INTRO para continuar...");
                               getchar();
                               system("clear");

                               fclose(archivo);
               }
                               else
                               printf("\nNumero tope de fichas alcanzado!!!.");
                               break;

               case 2:         if((archivo = fopen(rutarchivo, "rb")) == NULL){
                               printf("\nNO SE HA ENCONTRADO EL ARCHIVO!!!");
                               exit (1);
                               }

                               for (i = 0; i< CantFichas; i++){
                                   fseek(archivo, 0, SEEK_CUR);
                                   fread(&fichas, 1, sizeof(fichas), archivo);
                                   printf("%s\n", fichas.nombre);
                               }
                               printf("\nPulse INTRO para continuar...");
                               getchar();
                               fclose(archivo);
                               system("clear");
                               break;

               case 3:         if ((archivo = fopen(rutarchivo, "rb")) == NULL){
                                   printf("\nNO SE HA ENCONTRADO EL ARCHIVO!!!");
                                   exit (1);
                               }
                               printf("\nIntroduce un nombre: ");
                               gets(nombre);
                               for (i = 0; i<CantFichas; i++){
                                   fseek(archivo, 0, SEEK_CUR);
                                   fread(&fichas, 1, sizeof(fichas), archivo);
                                   if (strcmp(fichas.nombre, nombre) == 0){
                                   printf("\nNombre: %s\nDireccion: %s\nTelefono: %s\nCorreo: %s\nFecha de nacimiento: %s\n", fichas.nombre, fichas.direccion, fichas.movil, fichas.email, fichas.fechanacimiento);
                                   break;
                                   }
                               }
                               fclose(archivo);
                               printf("\nPresione INTRO para continuar...");
                               getchar();
                               system("clear");
                               break;

               case 4:         if (opcion == 4)
                               break;

               default:        printf("\nLa opción introducida no es correcta!!.\n");
                               system("clear");

           }
           }while (opcion != 4);

           return 0;
       }






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)