• Domingo 8 de Septiembre de 2024, 01:38

Autor Tema:  Problema Al Ejecutar Ficheros En C  (Leído 1942 veces)

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Problema Al Ejecutar Ficheros En C
« en: Miércoles 11 de Mayo de 2005, 02:21 »
0
Hola tengo que hacer una practica de ficheros  de c, estoy yendo poco a poco. Y bueno no es plande ponerle todo el codigo, solo les pondre, donde me dice el debug q me da error, dice q es en el fscanf y yo no sé por que.

int buscarPorMatri(char *fichero, int matri, struct vehiculo *coche)
{
  FILE *pfichero;
  int salir = 0;
  int encontrado = 0;
  int cont;
  struct vehiculo auxiliar;
  //struct vehiculo *coche;
 
  pfichero = fopen(fichero, "r"); /*abrimos para lectura*/
   while(salir ==0)
  {
   cont = fscanf(pfichero,"%s %d %f", auxiliar.tipo, &auxiliar.matri, &auxiliar.coste);
   
   /*en la variable cont almacenamos el numero de campos del fichero*/
   
   if(cont!=3) /*hemos llegado al final del fichero*/
      salir = 1;
    else
       if(auxiliar.matri == matri) /*ha encontrado el registro*/
       {
         encontrado = 1;
      salir = 1;
      *coche = auxiliar; /*almacena en coche el registro encontrado*/
      }
   
   }
   fclose(pfichero);
   return encontrado;
}

Yo ejecuto el programa, y se sale ,  y el debug me dice q es el fscanf de estga funcion, si alguien puede ayudarme, y quiere ver el codigo entero que me lo diga. Gracias, necesito consejos.

fuhrer

  • Miembro MUY activo
  • ***
  • Mensajes: 329
  • Nacionalidad: mx
    • Ver Perfil
    • http://admin.busquenoseninternet.com
Re: Problema Al Ejecutar Ficheros En C
« Respuesta #1 en: Miércoles 11 de Mayo de 2005, 02:33 »
0
Hola que tal.

La verdad no veo cual pueda ser el error, tal ves hubiera sido de más ayuda que especificaras que mensaje obtienes.

Si quieres pasarme tu código como dices para ver que es lo que sucede, así como el archivo del cual estas leyendo, espero poder ayudarte.

Hasta luego.

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Problema Al Ejecutar Ficheros En C
« Respuesta #2 en: Miércoles 11 de Mayo de 2005, 02:40 »
0
Cita de: "fuhrer"
Hola que tal.

La verdad no veo cual pueda ser el error, tal ves hubiera sido de más ayuda que especificaras que mensaje obtienes.

Si quieres pasarme tu código como dices para ver que es lo que sucede, así como el archivo del cual estas leyendo, espero poder ayudarte.

Hasta luego.
Gracias el codigo es este:

El archivo de funciones es este:

[CODE]
#include "cabecera.h"

int menu()
{
  int opcion;
  printf("1. Asegurar vehiculo\n");
  printf("2. Consultar fichero de coches\n");
  printf("3. Consultar fichero de clientes\n");
  printf("4. Consultar datos de un vehiculo y su propietario dada su matricula\n");
  printf("5. Consultar vehiculo dado el Nif Del cliente\n");
  printf("*****************************");
  printf("\nIntroduzca una opcion: ");
  scanf("%d", &opcion);
 
  //system("clear");
  return opcion;
}
 
void anyadirPropietario(char *fichero, struct propietario p1)
{
   FILE *pf;
   pf = fopen(fichero, "a");
   
   fprintf(pf, "%s %s %s %s\n", p1.nombre, p1.apellidos, p1.NIF, p1.direccion);
   
   fclose(pf);
}

void escribirVehiculo(struct vehiculo c1)
{
  printf("Tipo: %s  Matri: %d Coste: %3.2f \n", c1.tipo, c1.matri,c1.coste);
}

void escribirPropietario(struct propietario p1)
{
  printf("Nombre: %s  Apellidos: %s NIF: %s  Direccion: %s\n", p1.nombre, p1.apellidos, p1.NIF, p1.direccion);
}

void escribirDatosVePro(struct vehiculoPropietario aux)
{
  printf("Matricula: %d NIF: %s\n", aux.matri, aux.NIF);
}


 
void verPropietarios(char *fichero)
{
  FILE *pf;
  struct propietario p1;
  pf = fopen(fichero, "r"); /*se abre para lectura*/
 
  /*comienzo a leer datos hasta que llegue al final*/
 
  while(fscanf(pf, "%s %s %s %s", p1.nombre, p1.apellidos, p1.NIF, p1.direccion) == 4)
  {
     escribirPropietario(p1);
  }
  fclose(pf);
}

void verVehiculos(char *fichero)
{
  FILE *pf;
  struct vehiculo c1;
  pf = fopen(fichero, "r"); /*se abre para lectura*/
 
  /*comienzo a leer datos hasta que llegue al final*/
 
  while(fscanf(pf, "%s %d %f", c1.tipo, &c1.matri, &c1.coste) == 3)
  {
     escribirVehiculo(c1);
  }
  fclose(pf);
}


void verVePro(char *fichero, struct vehiculoPropietario nueva)
{
   FILE *pb;
   pb = fopen(fichero, "rb"); /*se abre para lectura*/
   
   /*comienzo a leer los datos hasta que llegue al final*/

   while(fread(&nueva, sizeof(struct vehiculoPropietario), 1, pb)==1)

   /*COmprueba que no ha llegado al final del fichero*/

   {
      /*HAY que comprobar que no este marcado como borrado*/
     /* if(coche1.borrado == 0)*/
        escribirDatosVePro(nueva); /*muestra el registro por pantalla*/
   }
   fclose(pb);
}
//leer el fichero y comprobar q no esta la matricula


void anyadirVehiculo(char *fichero, struct vehiculo c1)
{
 
   FILE *pf;
   pf = fopen(fichero, "a");

   
 
     fprintf(pf, "%s %d %3.2f\n", c1.tipo, c1.matri, c1.coste);

   /*printf("%s %d %f %s\n", coche.tipo, coche.matri, coche.coste);*/

   fclose(pf);
}

void anyadirVePro(char *fichero, struct vehiculoPropietario aux)
{
  FILE *pb;
  pb = fopen(fichero, "ab"); /*abre el fichero para añadir*/
 
  /*guarda los datos en el fichero*/

  fwrite(&aux, sizeof(struct vehiculoPropietario), 1, pb);
  fclose(pb);
}
 
int existeFichero(char *fichero)
{
   FILE *pf;
   
   pf = fopen(fichero, "r"); /*abre fichero para lectura*/
   
   if(pf == NULL) /*el fichero no existe*/
   {
   
      return 0;
   }
   else /*el fichero si existe*/
   {
      fclose(pf);
      return 1;
   }
}
 

int buscarPorMatri(char *fichero, int matri, struct vehiculo *coche)
{
  FILE *pfichero;
  int salir = 0;
  int encontrado = 0;
  int cont;
  struct vehiculo auxiliar;
  //struct vehiculo *coche;
 
  pfichero = fopen(fichero, "r"); /*abrimos para lectura*/
   while(salir ==0)
  {
   cont = fscanf(pfichero,"%s %d %f", auxiliar.tipo, &auxiliar.matri, &auxiliar.coste);
   
   /*en la variable cont almacenamos el numero de campos del fichero*/
   
   if(cont!=3) /*hemos llegado al final del fichero*/
      salir = 1;
    else
       if(auxiliar.matri == matri) /*ha encontrado el registro*/
       {
         encontrado = 1;
      salir = 1;
      *coche = auxiliar; /*almacena en coche el registro encontrado*/
      }
   
   }
   fclose(pfichero);
   return encontrado;
}
 
int buscarPorNIF(char *fichero, char *auxNIF)
{
  FILE *pf;
  int encontrado = 0; /*variables auxiliar para la busqueda*/
  struct propietario auxiliar;
 
  pf = fopen(fichero, "r"); /*abrimos para lectura*/
 
  while(fscanf(pf,"%s %s %s %s", auxiliar.nombre, auxiliar.apellidos,  auxiliar.NIF, auxiliar.direccion)==4)
   {
 
   if(strcmp(auxiliar.NIF, auxNIF)==0) /*ha encontrado el registro*/
   {
      escribirPropietario(auxiliar); /*se escriben sus datos*/
      encontrado = 1;
        }
    }
   fclose(pf);
   return encontrado;
 }

struct propietario introducirDatosPropietario()
{
   struct propietario aux;
    printf("\n Introducir nombre: ");
    gets(aux.nombre);
    printf("\n Introducir apellidos: ");
    gets(aux.apellidos);
    printf("\nIntroducir NIF: ");
    gets(aux.NIF);
    printf("\nIntroducir direccion: ");
    gets(aux.direccion);
    return aux;
}


int existePropietario(char *fichero, char *auxNIF, struct propietario p1)
{
   FILE *fp;
   int encontrado;

   fp  = fopen(fichero, "r");

   encontrado = buscarPorNIF(fichero, auxNIF);

   if(!encontrado)
   {
      return 0;
   }
   else {
      printf("\nEl propietario ya existe\n");
      fclose(fp);
      return 1;
   }
}


int existeVehiculo(char *fichero, int matri, struct vehiculo c1)
{
   FILE *fp;
   int encontrado;


   fp = fopen(fichero, "r"); //se abre para lectura


      encontrado = buscarPorMatri(fichero, matri, &c1);
      if(!encontrado)
      {
         return 0;
      }
      else{
         printf("\n El vehiculo ya existe\n");
         fclose(fp);
         return 1;
      }
   
}

         
   




struct vehiculo introducirDatosVehiculo()
{
   struct vehiculo aux;


    printf("\n Introducir tipo: ");
    scanf("%s", aux.tipo);
    getchar();
    /*printf("\n %s", aux.tipo);*/
   
    printf("\n Introducir matricula: ");
    scanf("%d", &aux.matri);
    getchar();
    /*printf("\n %d" ,aux.matri);*/
   
    printf("\nIntroducir coste: ");
    scanf("%f", &aux.coste);
    getchar();
    /*printf("\n %.3f", aux.coste);*/
 
   
    return aux;

   printf("\n La matricula es: %d", aux.matri);



   //crear una funcion q compruebe si existe o no el vehiculo
 
}
   
   /*
void borrarVehiculo(char *fichero, int matri)
{
 FILE *pf1, *pf2;
 struct vehiculo aux;
 
 pf1 = fopen(fichero, "r"); /*se abre para lectura el fichero original*
 
 pf2 = fopen("temporal.txt", "w"); /*se abre para escritura el fichero temporal*
 
 /*Se recorre el fichero original y los registros que no hay que borrar se psan
 al temporal*
 while(fscanf("%s %d %f", &aux.tipo, aux.matri, aux.coste) == 3)
 {
    if (aux.matri !=matri)
   
   fprintf(pf2, "%s %d %f\n", aux.tipo, aux.matri, aux.coste);
 }
   fclose(pf1);
   fclose(pf2);
   
   /*se borra el fichero original*
   remove(fichero);
   
   /*se renombra el temporal*
   rename("temporal.txt",fichero);
}
 

void borrarPropietario(char *fichero, char NIF)
{
 FILE *pf1, *pf2;
 struct propietario aux;
 
 pf1 = fopen(fichero, "r"); /*se abre para lectura el fichero original*
 
 pf2 = fopen("temporal.txt", "w"); /*se abre para escritura el fichero temporal*/
 
 /*Se recorre el fichero original y los registros que no hay que borrar se psan
 al temporal*
 while(fscanf("%s %s %s %s", aux.nombre, aux.apellidos, aux.NIF, aux.coste) ==
 4)
 {
    if (strcmp(aux.NIF, NIF)!=0)
   
   fprintf(pf2, "%s %s %s %s\n", aux.nombre, aux.apellidos, aux.NIF,
   aux.direccion);
 }
   fclose(pf1);
   fclose(pf2);
   
   /*se borra el fichero original*
   remove(fichero);
   
   /*se renombra el temporal/
   rename("temporal.txt",fichero);
}
          
   
*/
[CODE]
El de cabecera.h es este

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


struct vehiculo
{
     char tipo[7];
     int matri;
     float coste;
};

struct propietario
{
   char nombre[10];
   char apellidos[30];
   char NIF[10];
   char direccion[30];
};

struct vehiculoPropietario
{
   int matri;
   char NIF[10];
   
};

int menu();


void anyadirPropietario(char *fichero, struct propietario p1);
void anyadirVehiculo(char *fichero, struct vehiculo c1);
void anyadirVePro(char *fichero, struct vehiculoPropietario aux);
int existeFichero(char *fichero);
int buscarPorMatri(char *fichero, int matri, struct vehiculo *coche);
int buscarPorNIF(char *fichero, char *auxNIF);
void escribirDatosVePro(struct vehiculoPropietario aux);
void escribirPropietario(struct propietario p1);
void escribirVehiculo(struct vehiculo c1);

int existeVehiculo(char *fichero, int matri, struct vehiculo c1);
int existePropietario(char *fichero, char *auxNIF, struct propietario p1);


struct propietario introducirDatosPropietario();
struct vehiculo introducirDatosVehiculo();
void verPropietarios(char *fichero);
void verVehiculos(char *fichero);
void verVePro(char *fichero, struct vehiculoPropietario nueva);

Y el ppal.c es este

[CODE]
#include "cabecera.h"

struct vehiculoPropietario nueva;  
main(void)
{

//FILE *fictxt;
int opcion; /*variables para opcion del menu*/
int salir = 0; /*variable auxiliar usada en la busqueda*/
//int encontrado = 0; /*variable q indica si el registro se ha encontrado*/
int existe; /*variable auxiliar que indica si el fichero existe*/
int existe1;
char fichero[15];
struct vehiculo coche1;
struct propietario persona1;
//struct vehiculoPropietario nueva;

//system("clear");

/*introduccion del nombre del fichero para trabajar*/
printf("\nIntroduzca el nombre del fichero: ");
gets(fichero);



/*menu de opciones del programa*/
do{
   do{
     opcion = menu();
    }while(opcion <1 || opcion >3);
     switch(opcion)
     {
      case 1: /*asegurar un vehiculo*/
      {
         
         coche1= introducirDatosVehiculo();
         
            /*se añade el registro ya que seria el primero*/
            existe  = existeVehiculo(fichero, coche1.matri, coche1);
                 

         if(existe) /*el coche ya existe*/
          {
                  printf("\nVehiculo ya existente\n");
               exit(-1);
         }

               /*se añade el registro ya q seria el primero*/
               anyadirVehiculo(fichero, coche1);
                  printf("Vehiculo añadido. Pulse intro para seguir\n");
               
            
               persona1 = introducirDatosPropietario();
               existe1 = existePropietario(fichero, persona1.NIF, persona1);
         
            if(existe1)
            {
               printf("\n EL propiestario ya existe\n");
               exit(-1);
            }

               
            
                   anyadirPropietario(fichero, persona1);
                      anyadirVePro(fichero, nueva);
                   printf("\nPropietario añadido. Pulse intro para seguir\n");
            
               
              
        getchar();
    break;
       }
     
     case 2: /*visualizar todos los vehiculos asegurados*/
     {
       /*comprueba si existe el fichero*/
       existe = existeFichero(fichero);
       if(existe == 1) /*el fichero existe*/
       {
         verVehiculos(fichero); /*muestra los registros del fichero vehiculos*/
         printf("Datos leidos. Pulse INtro para continuar\n");
      }
      else /*el fichero no existe*/
      {
       printf("EL fichero de vehiculos no existe. Pulsa intro para ontinuar\n");
      }
      getchar();
      getchar();
   break;
      }
           
     
     case 3: /*visualizar todos los propietarios de vehiculos*/
      {
       /*comprueba si existe el fichero*/
       existe = existeFichero(fichero);
       if(existe == 1) /*el fichero existe*/
       {
         verPropietarios(fichero); /*muestra los registros del fichero vehiculos*/
      printf("Datos leidos. Pulse INtro para continuar\n");
      }
      else //el fichero no existe
      {
         printf("\nEL fichero de propietarios no existe. Pulsa intro para continuar\n");
      }
      getchar();
      getchar();
      break;
      }
       case 0: /*salida del programa*/
       break;
     
      }

}while(opcion!=3);
 
}

La practica va sobre un fichero de coches y otro de propietarios
y primero hay q introducir los coches, sin q se repita la matricula y luego los propietarios.< Muchas gracias, por responderme, pq estoy ya desesperada.
Es q en si, no me da ningun msj, de warning ni nada, es al ejecutar.

carmamezo

  • Miembro MUY activo
  • ***
  • Mensajes: 232
    • Ver Perfil
Re: Problema Al Ejecutar Ficheros En C
« Respuesta #3 en: Miércoles 11 de Mayo de 2005, 09:33 »
0
No he mirado todo el código por falta de tiempo pero te doy un consejo, cada vez que hagas un fopen comprueba que la función no te devuelva NULL, puede que al abrir algún fichero éste te devuelva NULL y luego al hacer fprintf() como el puntero a FILE vale NULL te de un error de ejecución.
Código: Text
  1.  
  2. FILE *pf;
  3.  
  4. if((pf=fopen(nombre_fichero,&#34;r&#34;))==NULL)
  5. {
  6. system(&#34;Cls&#34;);
  7. printf(&#34;&#092;n&#092;n&#092;t&#092;aERROR el fichero %s no se puede abrir.&#34;,nombre_fichero);
  8. getchar();
  9. }
  10.  
  11.  
Haz esto cada vez que hagas un fopen y así sabrás si los ficheros se abren bien o no.  Piensa que cuando abres para leer el fichero debe existir, mientras que para escribir y añadir el fichero si no existe se crea.
Un saludo. :lightsabre:
No hay tonto más molesto que el ingenioso.

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Problema Al Ejecutar Ficheros En C
« Respuesta #4 en: Miércoles 11 de Mayo de 2005, 13:18 »
0
Cita de: "carmamezo"
No he mirado todo el código por falta de tiempo pero te doy un consejo, cada vez que hagas un fopen comprueba que la función no te devuelva NULL, puede que al abrir algún fichero éste te devuelva NULL y luego al hacer fprintf() como el puntero a FILE vale NULL te de un error de ejecución.
Código: Text
  1.  
  2. FILE *pf;
  3.  
  4. if((pf=fopen(nombre_fichero,&#34;r&#34;))==NULL)
  5. {
  6. system(&#34;Cls&#34;);
  7. printf(&#34;&#092;n&#092;n&#092;t&#092;aERROR el fichero %s no se puede abrir.&#34;,nombre_fichero);
  8. getchar();
  9. }
  10.  
  11.  
Haz esto cada vez que hagas un fopen y así sabrás si los ficheros se abren bien o no.  Piensa que cuando abres para leer el fichero debe existir, mientras que para escribir y añadir el fichero si no existe se crea.
Un saludo. :lightsabre:
Gracias por rsponderme lo primero, he cogido nota de lo que me has dicho, pero aún asi sigue dandome error al ejecutar el programa. Es un error segun me dice, del fscanf de la funcion buscarporMatri, dice stream ! = NULL. Si estas interesado en ayudarme, dame tu correo, y  te envio el codigo entero.
Gracias de nuevo.

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Problema Al Ejecutar Ficheros En C
« Respuesta #5 en: Miércoles 18 de Mayo de 2005, 20:15 »
0
Cita de: "carmamezo"
No he mirado todo el código por falta de tiempo pero te doy un consejo, cada vez que hagas un fopen comprueba que la función no te devuelva NULL, puede que al abrir algún fichero éste te devuelva NULL y luego al hacer fprintf() como el puntero a FILE vale NULL te de un error de ejecución.
Código: Text
  1.  
  2. FILE *pf;
  3.  
  4. if((pf=fopen(nombre_fichero,&#34;r&#34;))==NULL)
  5. {
  6. system(&#34;Cls&#34;);
  7. printf(&#34;&#092;n&#092;n&#092;t&#092;aERROR el fichero %s no se puede abrir.&#34;,nombre_fichero);
  8. getchar();
  9. }
  10.  
  11.  
Haz esto cada vez que hagas un fopen y así sabrás si los ficheros se abren bien o no.  Piensa que cuando abres para leer el fichero debe existir, mientras que para escribir y añadir el fichero si no existe se crea.
Un saludo. :lightsabre:
Gracias por tu ayuda, resolvi mi problema de ejecucion.