Ayuda guardar archivos

Iniciado por juanks92, 28 Mayo 2013, 20:17 PM

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

juanks92

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 );
}
     




juanks92

solo me marca un error en el programa dice q c++ prohibe la comparacion entre puntero y entero

amchacon

Cita de: 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
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.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

juanks92

solo me dice que el error esta en esta linea

if(lista.estado!=1)

pero ahi mi duda no se que hacer

amchacon

Estás comparando una cadena con el valor 1?

Eso no tiene ningún sentido *_*
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

juanks92

Entonces con que lo puedo comparar

rir3760

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:
void guardar()
{
   FILE *fp;
   
   fp = fopen("Final.txt", "w" );
   
   for (i = 0; i < nn; i++){
      // Si la cadena NO es igual a "baja" se imprime en el archivo
      if (strcmp(lista[i].estado, "baja") != 0){
         fprintf(fp, "%s\n", lista[i].nombre);
         fprintf(fp, "%d\n", lista[i].edad);
      }
   }
   
   fclose(fp);
}


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|

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