Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema con archivos en C

Estas en el tema de problema con archivos en C en el foro de C/C++ en Foros del Web. Buenas, he estado practicando archivos en C ultimamente, y el último programa que debo hacer es un registro de votantes, posteriormente realizar una encuesta y ...
  #1 (permalink)  
Antiguo 01/07/2011, 06:20
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Pregunta problema con archivos en C

Buenas, he estado practicando archivos en C ultimamente, y el último programa que debo hacer es un registro de votantes, posteriormente realizar una encuesta y generar un nuevo archivo con los resultados. hasta ahí bien; el problema es que los resultados se muestran si o sólo si estás registrado en el archivo "votante", he intentado hacer la busqueda tradicional, pero nunca me encuentra la cedula del votante y ya estoy algo frustrado...les dejaré el código, si me pudieran hechar una mano estaría muy agradecido.

El código es de C, uso en el mensaje "etiqueta PHP" solo para que salga ordenado.

Código PHP:
   #include <stdio.h>
   #include <iostream>
   #include <conio.h>
   #define max 200
   
   
void registrarpersona();
   
void lista();
   
void resultado();
   
void encuesta();
   
    
int main ()
    {
        
int opcion 0;
    
        for(;;)
        {
            
lista();
            
opcion getch();
            switch (
opcion)
            {
                   case 
'1'registrarpersona();
                             break;
                   case 
'2'encuesta();
                             break;
                   case 
'3'resultado();
                             break;
                   case 
'4': exit(0);
            }
        }
    
        
system ("PAUSE");
    }
    
    
void registrarpersona()
    {
          
int edadacumulador =0;
          
char nombre[20], apellido[20], cedula[20];
      
          
FILE *persona;
      
          
printf ("\nIntroduzca los datos del votante en estricto orden\n");
                 
printf ("\ncedula ----- nombre ----- apellido ----- edad\n");
                        
scanf ("%s %s %s %d"cedulanombreapellido, &edad);
          
          if ((
persona=fopen("persona.txt""a+")) == NULL)
          {
                  
printf ("\nError al abrir el archivo\n");
          }
          else
          {
              while (!
feof(stdin))
              {
                      
fprintf (persona"%s %s %s %d\n"cedulanombreapellidoedad);
                      
scanf ("%s %s %s %d",cedula ,nombreapellido, &edad);
                      
acumulador++;
                      if (
acumulador == 200)
                      {
                                     break;
                      }
              }
              
fclose(persona);
          }
      }
      
      
void encuesta()
      {
           
int si 0no 0i;
           
int respuesta 0;
           
           
FILE*encuesta;
               
           for (
i=0i<2i++)
           {
               
printf ("\n¿es factible, económicamente hablando, la integración de Venezuela al mercosur?* 1.-Si 2.-No\n");
               
scanf ("%d", &respuesta);
               if (
respuesta == 1)
               {
                             
si++;
               }
               else
               {
                   if(
respuesta == 2)
                   {
                                
no++;
                   }
                   else
                   {
                       
printf ("\nError, debe seleccionar únicamente las opciones -1- o -2-\n");
                   }
               }
           }
           if ((
encuesta=fopen("encuesta.txt""a+")) == NULL)
           {
                  
printf ("\nError al abrir el archivo\n");
           }
           else
           {
                      
fprintf (encuesta"La cantidad de Respuestas es:\n");
                      
fprintf (encuesta"Si -> %d ---- No -> %d"sino);
              
              
fclose(encuesta);
           }
      }
      
      
void resultado()
      {
           
int edadn=0;
           
char cedulados[20];
           
char cedula[20], nombre[20], apellido[20];
           
int sino;
           
FILE*persona;
           
FILE*encuesta;
           
           
printf ("\nIntroduzca la cedula del votante\n");
           
scanf ("%s",&cedulados);
           if ((
persona=fopen("persona.txt""r+")) == NULL)
           {
                                        
printf ("\nError al abrir el archivo\n");
                                        
           }
           else
           {
               
fscanf(persona,"%s %s %s %d",cedula ,nombreapellido, &edad);
               while(!
feof(persona))
               {
                                    
fscanf(persona,"%s %s %s %d",&cedula ,&nombre, &apellido, &edad);
                                    
strcmp(cedula,cedulados);
                                    if (
n=0)
                                    {
                                            
fclose(persona);
                                            if ((
encuesta=fopen("encuesta.txt""r+")) == NULL)
                                            {
                                                                                
printf ("\nError al abrir el archivo\n");
                                            }
                                            else
                                            {
                                                
printf ("\nResultado - Encuesta\n\n");
                                                
fscanf(encuesta,"%d %d", &si, &no);
                                                
                                                      
printf  ("%d - %d"sino);
                                                      
fscanf(encuesta,"%d %d", &si, &no);
                                                      
printf ("\n\n");
                                                
                                                
fclose(encuesta);
                                            }
                            
printf ("\n");
                                   }
               }
                            
printf ("\nUsted no esta registrado como votante, por lo tanto no puede ver los resultados\n");
                                   
           }
      }
      
                  
      
void lista()
      {
           
printf("\n                         .::Sistema de Encuesta::.\n");
           
printf ("1.-Registrar Votante\n");
           
printf ("2.-Encuesta\n");
           
printf ("3.-Resultados de la Encuesta\n");
           
printf ("4.-salir\n");
           
printf ("\n\n");
      } 
  #2 (permalink)  
Antiguo 01/07/2011, 12:51
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: problema con archivos en C

En la función resultado tienes que poner n==0 en vez de n=0:

Código C:
Ver original
  1. void resultado()
  2.       {
  3.            int edad, n=0;
  4.            char cedulados[20];
  5.            char cedula[20], nombre[20], apellido[20];
  6.            int si, no;
  7.            FILE*persona;
  8.            FILE*encuesta;
  9.            
  10.            printf ("\nIntroduzca la cedula del votante\n");
  11.            scanf ("%s",&cedulados);
  12.            if ((persona=fopen("persona.txt", "r+")) == NULL)
  13.            {
  14.                                         printf ("\nError al abrir el archivo\n");
  15.                                          
  16.            }
  17.            else
  18.            {
  19.                fscanf(persona,"%s %s %s %d",cedula ,nombre, apellido, &edad);
  20.                while(!feof(persona))
  21.                {
  22.                                     fscanf(persona,"%s %s %s %d",&cedula ,&nombre, &apellido, &edad);
  23.                                     n = strcmp(cedula,cedulados);
  24.                                     if (n==0)
  25.                                     {
  26.                                             fclose(persona);
  27.                                             if ((encuesta=fopen("encuesta.txt", "r+")) == NULL)
  28.                                             {
  29.                                                                                 printf ("\nError al abrir el archivo\n");
  30.                                             }
  31.                                             else
  32.                                             {
  33.                                                 printf ("\nResultado - Encuesta\n\n");
  34.                                                 fscanf(encuesta,"%d %d", &si, &no);
  35.                                                  
  36.                                                       printf  ("%d - %d", si, no);
  37.                                                       fscanf(encuesta,"%d %d", &si, &no);
  38.                                                       printf ("\n\n");
  39.                                                  
  40.                                                 fclose(encuesta);
  41.                                             }
  42.                             printf ("\n");
  43.                                    }
  44.                }
  45.                             printf ("\nUsted no esta registrado como votante, por lo tanto no puede ver los resultados\n");
  46.                                    
  47.            }
  48.       }
  #3 (permalink)  
Antiguo 01/07/2011, 23:55
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

wow, muchas gracias, sabia que era una tontería pero estaba tan cansado que no lo veía, ahora tengo otro problema, cuando corro el programa, los resultados mostrados no son los que se acumularon, sino que corresponden a espacio de memoria.

todo lo demás va perfecto, pero cuando voy a mostrar el reporte de resultados, leyendo el archivo FILE*encuesta
sale algo así:

Resultado - Encuesta

2293544 - 16384

Probé a poner las variables así ---> si = 0, no =0;

pero entonces me muestra el resultado como 0.

Última edición por v1siond; 02/07/2011 a las 00:33
  #4 (permalink)  
Antiguo 02/07/2011, 09:12
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: problema con archivos en C

El problema es que no guardas bien los datos en el fichero (o por lo menos, los guardas de una manera e intentas recuperarlos de otra).
  #5 (permalink)  
Antiguo 02/07/2011, 11:19
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

los datos se guardan bien, ya que revizo el .txt que se crea y ahí están, pero a la hora de mostrarlo por pantalla es que no va.

Modifiqué nuevamente el programa y ahora muestra los resultados, pero sólo losdel momento.

estuve analizando el programa, y si la encuesta se realiza si y solo si el usuario está registrado, eso significa que sólo se realizaría la encuesta una vez, y esos resultados se guardarían en el archivo hasta que llegara a 200.

El problema es que los resultados que me muestra son los de la sesión, es decir si hubo un voto sólo se muestra ese voto.

¿Cómo haría para poder mostrar TODOS los resultados guardados en el archivo encuesta?
Código C:
Ver original
  1. /* el cne a definido conjuntamente con el ine mediante el censo 2011 un total
  2.    de 200 votantes. Se debe realizar un registro de los mismos mediante:
  3.    cedula, nombre, apellido y edad; una vez efectuado el registro se debe llamar
  4.    a un proceso de consulta mediante la siguiente pregunta
  5.    ¿es factible, económicamente hablando, la integración de Venezuela al mercosur?* 1.-Si 2.-No.
  6.    El registro debe efectuarse mediante archivos y la consulta se realizará si y sólo si
  7.    la persona se encuentra registrada en el archivo; al final del sistema se debe crear un reporte
  8.    con los resultados de la consulta.*/
  9.    
  10.    #include <stdio.h>
  11.    #include <iostream>
  12.    #include <conio.h>
  13.    #define max 200
  14.    
  15.    void registrarpersona();
  16.    void lista();
  17.    void resultado();
  18.    void encuesta();
  19.    
  20.     int main ()
  21.     {
  22.         int opcion = 0;
  23.    
  24.         for(;;)
  25.         {
  26.             lista();
  27.             opcion = getch();
  28.             switch (opcion)
  29.             {
  30.                    case '1': registrarpersona();
  31.                              break;
  32.                    case '2': encuesta();
  33.                              break;
  34.                    case '3': exit(0);
  35.             }
  36.         }
  37.    
  38.         system ("PAUSE");
  39.     }
  40.    
  41.     void registrarpersona()
  42.     {
  43.           int edad, acumulador =0;
  44.           char nombre[20], apellido[20], cedula[20];
  45.          
  46.      
  47.           FILE *persona;
  48.      
  49.           printf ("\n            .::Introduzca los datos del votante en estricto orden::.\n");
  50.           printf ("\n               .::Si desea salir del registro presione ctrl + Z::.\n");
  51.                  printf ("\ncedula ----- nombre ----- apellido ----- edad\n");
  52.                         scanf ("%s %s %s %d", cedula, nombre, apellido, &edad);
  53.                         if(edad < 18)
  54.                         {
  55.                                 printf ("\nDebe tener 18 años para poder votar\n");
  56.                         }
  57.                         else
  58.                         {    
  59.                               if ((persona=fopen("persona.txt", "a+")) == NULL)
  60.                               {
  61.                                                 printf ("\nError al abrir el archivo\n");
  62.                               }
  63.                               else
  64.                               {
  65.                                                 while (!feof(stdin))
  66.                                                 {
  67.                                                       fprintf (persona, "%s %s %s %d\n", cedula, nombre, apellido, edad);
  68.                                                       scanf ("%s %s %s %d",cedula ,nombre, apellido, &edad);
  69.                                                       acumulador++;
  70.                                                       if (acumulador == 200)
  71.                                                       {
  72.                                                                      break;
  73.                                                       }
  74.                                                 }
  75.                                                 fclose(persona);
  76.                               }
  77.                         }
  78.       }
  79.      
  80.       void encuesta()
  81.       {
  82.            int edad, n=0;
  83.            char cedulados[20],i;
  84.            char cedula[20], nombre[20], apellido[20];
  85.            int si=0, no=0, j=0;
  86.            int respuesta = 0;
  87.            FILE*persona;
  88.            FILE*encuesta;
  89.      
  90.            printf ("\nIntroduzca la cedula del votante\n");
  91.            scanf ("%s",cedulados);
  92.            if ((persona=fopen("persona.txt", "r+")) == NULL)
  93.            {
  94.                                         printf ("\nError al abrir el archivo\n");
  95.                                        
  96.            }
  97.            else
  98.            {
  99.                while(!feof(persona))
  100.                {
  101.                                     fscanf(persona,"%s %s %s %d",&cedula ,&nombre, &apellido, &edad);
  102.                                     n = strcmp(cedula,cedulados);
  103.                                     if (n==0)
  104.                                     {    
  105.                                              for (i=0; i<1; i++)
  106.                                              {
  107.                                                        printf ("\n¿Es factible, economicamente hablando, la integracion de Venezuela al mercosur?* 1.-Si 2.-No\n");
  108.                                                        scanf ("%d", &respuesta);
  109.                                                        if (respuesta == 1)
  110.                                                        {
  111.                                                                       si++;
  112.                                                        }
  113.                                                        else
  114.                                                        {
  115.                                                            if(respuesta == 2)
  116.                                                            {
  117.                                                                     no++;
  118.                                                            }
  119.                                                            else
  120.                                                            {
  121.                                                                     printf ("\nError, debe seleccionar unicamente las opciones -1- o -2-\n");
  122.                                                            }
  123.                                                        }
  124.                                              }
  125.                                              break;
  126.                                      }
  127.                }
  128.                 if (n!=0)
  129.                 {
  130.                 printf ("\nUsted no esta registrado como votante, por lo tanto no puede ver los resultados\n");
  131.                 printf ("\nSi desea realizar la encuesta debe registrarse como votante, seleccionando la opcion 1 del menu\n\n");
  132.                 }                  
  133.                                      if ((encuesta=fopen("encuesta.txt", "a+")) == NULL)
  134.                                      {
  135.                                                                          printf ("\nError al abrir el archivo\n");
  136.                                      }
  137.                                      else
  138.                                      {
  139.                                          for(i=0; i<1; i++)
  140.                                          {
  141.                                                   fprintf (encuesta, "                            .::Resultado::.\n\n");
  142.                                                   fprintf (encuesta, "Si -> %d ---- No -> %d\n\n", si, no);
  143.                                          }
  144.                                          fclose(encuesta);
  145.                                      }
  146.                                      
  147.                                      
  148.              }  
  149.                                             if ((encuesta=fopen("encuesta.txt", "r+")) == NULL)
  150.                                             {
  151.                                                                                 printf ("\nError al abrir el archivo\n");
  152.                                             }
  153.                                             else
  154.                                             {
  155.                                                 while (!feof(encuesta))
  156.                                                 {
  157.                                                       printf ("\n                              .::Resultado::.\n\n");
  158.                                                       fscanf(encuesta,"%d %d", &si, &no);
  159.                                                       printf  ("%d - %d", si, no);
  160.                                                       fscanf(encuesta,"%d %d", &si, &no);
  161.                                                       printf ("\n\n");
  162.                                                 }
  163.                                                 fclose(encuesta);
  164.                                             }
  165.                             printf ("\n\n");
  166.       }          
  167.       void lista()
  168.       {
  169.            printf("\n                         .::Sistema de Encuesta::.\n");
  170.            printf ("1.-Registrar Votante\n");
  171.            printf ("2.-Encuesta\n");
  172.            printf ("3.-salir\n");
  173.            printf ("\n\n");
  174.       }

En la parte de la función "encuesta" la razón por la que uso en el for i<2 en vez de i<max, es debido a que es un programa de prueba, no vale la pena guardar 200 respuestas o 200 usuarios si el programa no está perfectamente funcional.

Última edición por v1siond; 03/07/2011 a las 13:33
  #6 (permalink)  
Antiguo 04/07/2011, 10:37
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

perdon doble post, pero ya no sé que hacer...some help please
  #7 (permalink)  
Antiguo 04/07/2011, 11:38
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con archivos en C

Dos coas: Cuando lees los resultados:
Código C:
Ver original
  1. while (!feof(encuesta))
  2.                                                 {
  3.                                                       printf ("\n                              .::Resultado::.\n\n");
  4.                                                       fscanf(encuesta,"%d %d", &si, &no);
  5.                                                       printf  ("%d - %d", si, no);
  6.                                                       fscanf(encuesta,"%d %d", &si, &no);
  7.                                                       printf ("\n\n");
  8.                                                 }

Porque lees dos veces en un mismo ciclo. Eso te puede traer proglemas.

Código C:
Ver original
  1. printf ("\n                              .::Resultado::.\n\n");
  2.   while (!feof(encuesta))
  3.                                                 {
  4.                                                      
  5.                                                       fscanf(encuesta,"%d %d", &si, &no);
  6.                                                       printf  ("%d - %d\n", si, no);
  7.                                                 }

Podrias mostrar archivos de ejemplos de personas y encuetas.

Encontre otro problema. La linea 101 esta mal. deberias ser :
fscanf(persona,"%s %s %s %d",cedula ,nombre, apellido, &edad);
Sin el operador & ya que son cadenas. Ese error era muy deducible gracias a los mensajes del compiladors. Tienes uqe aprendera usarlo.

Y por ultimo otro problema:
Cuando guardas los resultados en el archivo no tienes que escribir todo los titulos "RESULTADOS" simplemente deberias imprimir los numeros que tiene las variables si , no: algo asi digo (linea 141 y 142):
fprintf(encuesta, "%d %d\n", si,no);

Con esos cambios, a mi me funcioan bien el programa.

Última edición por sam90; 04/07/2011 a las 11:50
  #8 (permalink)  
Antiguo 04/07/2011, 12:12
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

Esos cambios ya los había hecho, pero nada sigue igual, me muestra únicamente el resultado de la sesión, es decir el voto de ese único votante, yo lo que quiero es que por ejemplo, verifique el votante, se realice un voto y a la hora de mostrar los resultados, si se han hecho 50 votos, los muestre todos, no sólo 1...igualmente, hice los cambios que me sugeriste (el del & se me pasó) y en el while(!feof(encuesta)) de mostrado de resultados, se crea un ciclo infinito, que facilmente se para con un break, pero aún así el programa sigue sin hacer lo que quiero...Muchas gracias por la ayuda.

Última edición por v1siond; 04/07/2011 a las 12:18
  #9 (permalink)  
Antiguo 04/07/2011, 12:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con archivos en C

Entonces no se que es lo que quieres. El archivo encuentas se guarda como quieres?? vos queres que te sume todo los Si y los no de los renglones y despues muestre el total?
  #10 (permalink)  
Antiguo 04/07/2011, 12:37
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

te explico, cuando se guarda la respuesta en el archivo "encuesta" queda algo asi

Si -> 0 no -> 1
Si -> 1 No -> 0
.
.
.
lo que yo quiero es que a la hora de mostrar resultados, me lea todos los
Si -> 0 no -> 1
Si -> 1 No -> 0

y los muestre tal cual por pantalla, si hay 50 muestre los 50 resultados guardados, no sólo el que se acaba de hacer.

entonces, por pantalla debería salir algo así
Si -> 0 no -> 1
Si -> 1 No -> 0
Si -> 0 no -> 1
Si -> 1 No -> 0
Si -> 0 no -> 1
Si -> 1 No -> 0
Si -> 0 no -> 1
Si -> 1 No -> 0
Si -> 0 no -> 1
Si -> 1 No -> 0
Si -> 0 no -> 1
Si -> 1 No -> 0
.
.
.
a la hora de imprimir el archivo.

Aunque lo que sugieres de sumar todos los si y no y mostrarlos, también es una buena idea, aunque lo veo más complicado.
  #11 (permalink)  
Antiguo 04/07/2011, 12:46
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: problema con archivos en C

eso es facil. primero deberias cambiar la lineas 141 y 142 como te dje y luego cambias las lineas 157 a 161 por :

fscanf(encuesta,"%d %d", &si, &no);
printf ("SI -> %d No -> %d\n", si, no);

Y listo, tema resuelto!
  #12 (permalink)  
Antiguo 04/07/2011, 12:51
 
Fecha de Ingreso: julio-2011
Mensajes: 17
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: problema con archivos en C

eso era!, muchas gracias, el error era un fprintf mal usado, muchas gracias sam90, te debo la vida.

Última edición por v1siond; 04/07/2011 a las 13:02

Etiquetas: software-general
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:26.