• Domingo 29 de Septiembre de 2024, 08:31

Autor Tema:  Problemas con Ficheros  (Leído 1043 veces)

Donky

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Problemas con Ficheros
« en: Lunes 15 de Junio de 2009, 12:05 »
0
Hola muy buenas a todos!
Estoy liado con un programa de manejo de archivos y me está dando errores en las dos funciones que tengo creadas para imprimir datos, por más vueltas que le doy no se qué es lo que me falla, espero que vosotros podáis ver el problema. Gracias de antemano.
Las funciones son imprimirCasados e imprimirMujeres
Os dejo el código.
Gracias de antemano!!

Código: C
  1. /*En una ciudad española se ha grabado el fichero FCENSO.DAT con datos de sus vecinos cuyos registros están formados por los siguientes campos:
  2.     CS_COD      CS_NOM      CS_EDAD     CS_HIJO     CS_SEXO     CS_ECIV
  3.     char[5]     char[20]     int          int         char        char
  4. siendo CS_HIJO el número de hijos, y los códigos vláidos para CS_SEXO V o H, y para CS_ECIV S, C y V.
  5.  
  6. Se desea:
  7.     - Imprimir el número de personas casadas y la media de hijos que tienen.
  8.     - Imprimir el nombre y la edad de las mujeres solteras con edades comprendidas entre dos valores introducidos por el teclado.
  9.     - Añadir registros al fichero.
  10.     - El fichero será de tipo texto.*/
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14.  
  15. typedef struct _censo {
  16.    char cs_cod[5];
  17.    char cs_nom[20];
  18.    int cs_edad;
  19.    int cs_hijo;
  20.    char cs_sexo;
  21.    char cs_eciv;
  22.    
  23. }strCenso;
  24.  
  25. void _menu();
  26. void agregarRegistro(char *fichero);
  27. void imprimirCasados();
  28. void imprimirMujeres();
  29.  
  30. int main(void)
  31. {
  32.    int min,max;
  33.    char opcion;
  34.    char fichero[14] = "fcenso.txt";
  35.    do{
  36.         _menu();
  37.         opcion = getch();
  38.    switch (opcion){
  39.           case '1':
  40.           agregarRegistro(fichero);
  41.           break;
  42.           case '2':
  43.           imprimirCasados(fichero);
  44.           break;
  45.           case '3':
  46.           printf("nEdad minima -> ");
  47.           scanf("%d",&min);
  48.           printf("nEdad maxima -> ");
  49.           scanf("%d",&max);
  50.           imprimirMujeres(min,max, fichero);    
  51.           break;
  52.           case '4':
  53.                exit;
  54.           break;
  55.    }}while (opcion!='4');
  56.    puts("nnPrograma finalizadon");
  57.    return 0;
  58. }
  59.  
  60. void _menu(){
  61.      printf("Programa Censon");
  62.      printf ("1 - Añadir Registrosn");
  63.      printf ("2 - Mostrar Personas Casadasn");
  64.      printf ("3 - Imprimir Mujeresn" );
  65.      printf ("4 - Salir");
  66.      printf ("Escoge una opcion");
  67.      fflush(stdout);
  68.      
  69.      }
  70. void agregarRegistro(char *fichero)
  71. {
  72.    FILE *pFichero;
  73.    strCenso registro;
  74.    
  75.    
  76.    if (pFichero == NULL) {
  77.                 pFichero = fopen(fichero, "w");
  78.                  printf("nCodigo: ");
  79.                  scanf ("%s", registro.cs_cod);
  80.                  fflush(stdin);      
  81.                  printf("Nombre: ");
  82.                  gets(registro.cs_nom);
  83.                  fflush(stdin);
  84.    
  85.                  printf("Edad: ");
  86.                  scanf("%d", &registro.cs_edad);
  87.                  fflush(stdin);
  88.    
  89.                  printf("Numero de Hijos: ");
  90.                  scanf("%d", &registro.cs_hijo);
  91.                  fflush(stdin);
  92.    
  93.                  printf("Sexo (v o h): ");
  94.                  scanf ("%c", &registro.cs_sexo);
  95.                  fflush(stdin);
  96.    
  97.                  printf("Estado Civil (s, c o v): ");
  98.                  scanf("%c", &registro.cs_eciv);
  99.                  fflush(stdin);
  100.    
  101.                  fprintf(pFichero, "%s %s %d %d %c %cn", registro.cs_cod, registro.cs_nom, registro.cs_edad, registro.cs_hijo, registro.cs_sexo, registro.cs_eciv);
  102.                  fclose(pFichero);
  103.  
  104.    }
  105.    else
  106.    {
  107.                  pFichero = fopen(fichero, "a");
  108.                  printf("nCodigo: ");
  109.                  scanf ("%s", registro.cs_cod);
  110.                  fflush(stdin);      
  111.                  printf("Nombre: ");
  112.                  gets(registro.cs_nom);
  113.                  fflush(stdin);
  114.    
  115.                  printf("Edad: ");
  116.                  scanf("%d", &registro.cs_edad);
  117.                  fflush(stdin);
  118.    
  119.                  printf("Numero de Hijos: ");
  120.                  scanf("%d", &registro.cs_hijo);
  121.                  fflush(stdin);
  122.    
  123.                  printf("Sexo (v o h): ");
  124.                  scanf ("%c", &registro.cs_sexo);
  125.                  fflush(stdin);
  126.    
  127.                  printf("Estado Civil (s, c o v): ");
  128.                  scanf("%c", &registro.cs_eciv);
  129.                  fflush(stdin);
  130.    
  131.                  fprintf(pFichero, "%s %s %d %d %c %cn", registro.cs_cod, registro.cs_nom, registro.cs_edad, registro.cs_hijo, registro.cs_sexo, registro.cs_eciv);
  132.                  fclose(pFichero);
  133.             }
  134. }
  135. void imprimirCasados(char *fichero)
  136.    {
  137.     FILE *pfichero;
  138.     int casadas=0;
  139.     float hijos=0;
  140.     strCenso registro;
  141.     if(fopen(fichero,"r")==NULL)
  142.         {
  143.         printf("nERROR al abrir el archivo para lecturan");  
  144.         exit(1);
  145.         }    
  146.    
  147.     if(fgetc(pfichero)!=EOF)  //Por si está vacío
  148.         {
  149.         do
  150.             {
  151.             fscanf(pfichero, "%s %s %d %d %c %cn", registro.cs_cod, registro.cs_nom, registro.cs_edad, registro.cs_hijo, registro.cs_sexo, registro.cs_eciv);
  152.              if(registro.cs_eciv=='c')
  153.              {
  154.                 casadas++;
  155.                 hijos+=registro.cs_hijo;
  156.              }
  157.             }while(fgetc(pfichero)!=EOF);
  158.         if(casadas)
  159.             printf("nEl numero de personas casadas es %d y su media de hijos %.2fn",casadas,hijos/casadas);
  160.         else
  161.             printf("nNo hay personas casadas");
  162.         }
  163.     else
  164.         printf("nEl fichero esta vacion");
  165.     fclose(pfichero);
  166.     }      
  167.  
  168.  
  169. void imprimirMujeres(int min, int max, char *fichero)
  170.     {
  171.     FILE *pfichero;
  172.     int casadas=0,entra=0;
  173.     float hijos=0;
  174.     strCenso registro;
  175.    if((fopen(fichero,"r"))==NULL)
  176.         {
  177.         printf("nERROR al abrir el archivo para lecturan");  
  178.         exit(1);
  179.         }      
  180.    
  181.     if(fgetc(pfichero)!=EOF)  //Por si está vacío
  182.         {
  183.         do
  184.             {
  185.             fscanf(pfichero, "%s %s %d %d %c %cn", registro.cs_cod, registro.cs_nom, registro.cs_edad, registro.cs_hijo, registro.cs_sexo, registro.cs_eciv);
  186.             if(registro.cs_sexo=='h' && registro.cs_edad>=min && registro.cs_edad<=max)
  187.                 {
  188.                 entra=1;
  189.                 printf("nNombre %sEdad %d anios",registro.cs_nom,registro.cs_edad);
  190.                 }
  191.             }while(fgetc(pfichero)!=EOF);
  192.         if(!entra)
  193.             printf("nNinguna mujer cumple con las condicionesn");
  194.         }
  195.     else
  196.         printf("nEl fichero esta vacion");
  197.     fclose(pfichero);
  198.     }
  199.  
  200.  
  201.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problemas con Ficheros
« Respuesta #1 en: Lunes 15 de Junio de 2009, 13:27 »
0
Cita de: "Donky"
me está dando errores en las dos funciones que tengo creadas para imprimir datos
Entonces supondré que los ficheros los escribes bien  :P

Código: C
  1. if(fgetc(pfichero)!=EOF)
  2.  
Aquí estás leyendo efectivamente un carácter del fichero, no sólo comprobando el final de fichero. Usa la función eof(FILE *)