Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: juanks92 en 28 Mayo 2013, 20:17 pm



Título: Ayuda guardar archivos
Publicado por: juanks92 en 28 Mayo 2013, 20:17 pm
Hola que tal tengo este programa y quiero guardarlo en archivos alguien me puede decir por que no corre el programa solo quiero saber de la opcion de guardar se que el programa no es el mejor pero soy un principiante gracias



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

struct alumnos
{
       char nombre[10];
       char estado [5];
       int edad;
};

alumnos lista[10];

int i=1;
int b,c,ver,j,w,x,op,h,nn;


alumnos altas();
alumnos bajas();
alumnos cambios();
alumnos despliegues();
alumnos guardar();

int main()
 
   {
    int t;
        FILE *archivo;
        char caracter;
        char nom[10];
        int edad1;
 
        archivo = fopen("Final.txt","r");
 
        if (archivo == NULL)
          {
 
           printf("\nError de apertura del archivo. \n\n");
          }
        else
          {
             int h=0;
             char texto[10];
             int zenb;
             while(fgets(lista[h].nombre, 10, archivo))
             {
               printf("%s", lista[h].nombre);
               fgets(texto,10,archivo);
               sscanf(texto,"%d",&zenb);
               lista[h].edad=zenb;             
               printf("%d", lista[h].edad);
               h++;
                       
             }
              fclose(archivo);
              nn=h;
              printf("%d", nn);
              getch();
          }

   do
   {
   printf("\nseleccione una de las opciones\n1.-altas===========>1\n2.-bajas===========>2\n3.-cambios=========>3\n4.-despliegues=====>4\n");
   scanf("%d",&op);
   system("cls");

       switch (op)
      {
        case 1: do
          {
           altas();
           printf("\n¿Quiere dar de alta ha alguien mas?\n");
           printf("Si la respuesta es si presione 1\npara salir presione 2\n");
           scanf("%d",&h);
          }while(h==1);
           break;
        case 2: bajas(); break;
        case 3: cambios(); break;
        case 4: despliegues(); break;
      }
    printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
    scanf("%d",&x);

   }while(x==1);

  }
 alumnos altas()
   {
    printf("Nombre:\n ");
    scanf("%s",&lista.nombre);
    system("cls");
    FILE *fp;
     fp = fopen ("Final.txt", "a" );
     printf("Edad:\n ");
    scanf("%d",&lista.edad);
    system("cls");
    printf("Estado:\n ");
    scanf("%s",&lista.estado);
     fprintf(fp,"%s\n",lista.nombre);
     fprintf(fp,"%d\n",lista.edad);
     fprintf(fp,"%s\n",lista.estado);
       
    system("cls");
     fclose ( fp );
     alumnos guardar();
     getch();

    i++;
   
    }   

  alumnos bajas()
   {
     printf("alumno que desea dar de baja\n");
     scanf("%d",&b);
     strcpy(lista.estado,"baja");
     alumnos guardar();
   }

  alumnos cambios()
   {
     printf("Que alumno desea modificar\n");
     scanf("%d",&c);
     printf("Datos actuales:\nnombre: %s\n",lista[c].nombre);
     printf("edad: %d\n",lista[c].edad);
     printf("estado:%s",lista[c].estado);

     printf("\nIngresar nuevos datos");
     printf("\nNombre: ");
     scanf("%s",&lista[c].nombre);
     system("cls");
     printf("Edad:");
     scanf("%d",&lista[c].edad);
     system("cls");
     printf("Estado:");
     scanf("%s",&lista[c].estado);
     system("cls");
   }

  alumnos despliegues()
   {
     printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
     scanf("%d",&ver);
     fflush(stdin);
     if (ver==1)
       {
       printf("Alumno al cual quiere visualizar\n");
       scanf("%d",&w);
       printf("nombre: %s\n",lista[w].nombre);
       printf("edad: %d\n",lista[w].edad);
       printf("estado: %s\n",lista[w].estado);
       }
     else
       {
       printf("Todos los datos son:\n");
       for (j=1;j<=i;j++)
         {
           printf("nombre: %s\n",lista[j].nombre);
           printf("edad: %d\n",lista[j].edad);
           printf("estado: %s\n",lista[j].estado);
         }
       }
      
      }

// Esta parte no me funciona        
   alumnos guardar()
{
     FILE *fp;
     fp = fopen ("Final.txt", "w" );
      for(i=0;i<nn;i++)
            {                                 
                  if(lista.estado!=1){
                  fprintf(fp,"%s\n",lista.nombre);
                  fprintf(fp,"%d\n",lista.edad);
                  fprintf(fp,"%d\n",lista.estado);
                  }
            }
     fclose ( fp );
}
     


 


Título: Re: Ayuda guardar archivos
Publicado por: juanks92 en 28 Mayo 2013, 20:41 pm
solo me marca un error en el programa dice q c++ prohibe la comparacion entre puntero y entero


Título: Re: Ayuda guardar archivos
Publicado por: amchacon en 28 Mayo 2013, 21:24 pm
solo me marca un error en el programa dice q c++ prohibe la comparacion entre puntero y entero
Pues hijo, más claro agua. Estás comparando un puntero con un numero.

El error te dirá en que línea es, no tienes ni que buscarla.


Título: Re: Ayuda guardar archivos
Publicado por: juanks92 en 28 Mayo 2013, 21:40 pm
solo me dice que el error esta en esta linea

if(lista.estado!=1)

pero ahi mi duda no se que hacer


Título: Re: Ayuda guardar archivos
Publicado por: amchacon en 28 Mayo 2013, 21:49 pm
Estás comparando una cadena con el valor 1?

Eso no tiene ningún sentido *_*


Título: Re: Ayuda guardar archivos
Publicado por: juanks92 en 28 Mayo 2013, 21:51 pm
Entonces con que lo puedo comparar


Título: Re: Ayuda guardar archivos
Publicado por: rir3760 en 30 Mayo 2013, 15:09 pm
Como ya te indico amchacon el error se genera al tratar de comparar el campo estado (de tipo "char [5]") con el valor 1 (de tipo signed int).

En su lugar debes compararlo con otra cadena utilizando la función strcmp y verificando si el valor de retorno de la función es cero, si es así las cadenas son iguales. Suponiendo que utilizas "baja" para eliminar de forma lógica un registro esa función se debe cambiar a:
Código
  1. void guardar()
  2. {
  3.   FILE *fp;
  4.  
  5.   fp = fopen("Final.txt", "w" );
  6.  
  7.   for (i = 0; i < nn; i++){
  8.      // Si la cadena NO es igual a "baja" se imprime en el archivo
  9.      if (strcmp(lista[i].estado, "baja") != 0){
  10.         fprintf(fp, "%s\n", lista[i].nombre);
  11.         fprintf(fp, "%d\n", lista[i].edad);
  12.      }
  13.   }
  14.  
  15.   fclose(fp);
  16. }

Aparte de eso se deben corregir otras partes del programa, por ejemplo declaras todas las funciones con el tipo de retorno "alumnos" pero ninguna retorna un valor, hay que cambiarlas para que retornen "void".

También hay que evitar el uso de la biblioteca conio de Borland y el uso de fflush(stdin). Explicaciones del porque de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html)

Un saludo