Problema con Ejecutable

Iniciado por arkangel2006, 13 Marzo 2015, 03:10 AM

0 Miembros y 1 Visitante están viendo este tema.

arkangel2006

Hola  buen dia realizado un codigo en C y al momento de compilar me dice que no hay errores pero el problema que cuando abre el ejecutable muestra un error, ya descarte que sea problema del compilador  debido a que otros  codigos si me ejecuta bien...

les dejo el codigo para que medigan si acaso es alguna parte que tengo mal programada-escrito...



#include <stdio.h>
#include <stdlib.h>
#define LNOMBRE 50
#define LDIRECCION 100
   typedef struct
   {
      char nombre[LNOMBRE];          /* Nombre */
      char direccion[LDIRECCION];    /* Dirección */
      long telefono;                 /* Teléfono */
   } TipoDato;
/* Lee un dato desde el registro indicado */
   int leeDato(FILE *fichero, TipoDato *dato, int pos)
   {
      if(fseek(fichero,pos*sizeof(TipoDato),SEEK_SET))
         return 0;
      return fread(dato, sizeof(TipoDato),1,fichero)==1;
   }
/* Escribe un dato desde el registro indicado */
   int escribeDato(FILE *fichero, TipoDato *dato, int pos)
   {
      if(fseek(fichero,pos*sizeof(TipoDato),SEEK_SET))
         return 0;
      return fwrite(dato, sizeof(TipoDato),1,fichero)==1;
   }
/* Añade un dato al final del fichero */
   int anadeDato(FILE *fichero, TipoDato *dato)
   {
      if(fseek(fichero,0,SEEK_END))
         return 0;
      return fwrite(dato, sizeof(TipoDato),1,fichero)==1;
   }
/*Programa de prueba que aleatoriamente añade o modifica */
   int main()
   {
      int i,nreg,anade,res;
      FILE *f;
      TipoDato d;
      if((f=fopen("listin.bin","r+b"))== NULL)
         return 1;
   /*Muestra los datos*/
      for(i=0; ; i++)
         if(leeDato(f,&d,i))
            printf("Registro :%d\nNombre: %s\nDireccion: %s\nTelefono : %dl\n",
                  i+1,d.nombre,d.direccion, d.telefono);
         else
            break;
      anade=rand()%2;
      if(anade)
         printf("Adición de registro\n");
      else
      {
         printf("Modificación de registro\n");
         printf("Número de registro ");
         scanf("%d",&nreg);
         gets(d.nombre);  /* Se lee el final de línea que queda */
      }
      printf("Nombre ");
      gets(d.nombre);
      printf("Dirección ");
      gets(d.direccion);
      printf("Número de teléfono ");
      scanf("%dl",&d.telefono);
      if(anade)
         res=anadeDato(f,&d);
      else
         res=escribeDato(f,&d,nreg-1);
      if(!res)
         printf("Error\n");
      fclose(f);
      return 0;
}



esta es lo que me muestra el ejecutable:
http://www.subirimagenes.net/i/150313030930376587.jpg

rir3760

El programa termina retornando el valor uno y ese valor lo retorna tu programa si la apertura del archivo falla, ya que utilizas el modo "r+b" el archivo debe existir. Para estar seguros cambia la verificación de fopen a:
if ((f = fopen("listin.bin","r+b")) == NULL){
   perror("listin.bin");
   return 1;
}


Aparte de eso hay que evitar el uso de gets ya que esta puede causar el error en tiempo de ejecución si el destino de datos se desborda y por ultimo hay que cambiar esta llamada a scanf:
printf("Número de teléfono ");
scanf("%dl",&d.telefono);

Ya que el especificador para el tipo long es "%ld".

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

arkangel2006

Gracias por responder Maestro rir3760 con esas observaciones e me hisistes  funcionar el programa y tendre encuenta tu comentario de el uso de gets  Dios te bendiga.