Archivos

Iniciado por juanks92, 13 Mayo 2013, 18:29 PM

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

juanks92

Hola que tal hice un programa de altas, bajas, despliegues y cambios y si funciona pero ahora me pidieron usarlo en archivos el programa tiene q dar de alta y guardar los datos si cierro el programa tiene q guardar esos datos al usar despliegues y si quiero hacer cambios tiene q guardar esos cambios alguien que me pueda ayudar aqui esta el programa de altas y bajas


#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;// variable altas y despliegues
int b; // variable bajas
int c; // variable cambios
int ver,j,w ; //variables despliegues
int x; // variable while(despliegues)
int op; // switch
int h; // variable while (switch)


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

main()
{
   do
   {
   printf("\nseleccione una de las opciones\n1.-altas\n2.-bajas\n3.-cambios\n4.-despliegues\n");
   scanf("%d",&op);

       switch (op)
      {
        case 1: do
          {
           altas();
           printf("¿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: ");
    scanf("%s",&lista.nombre);
    printf("Edad: ");
    scanf("%d",&lista.edad);
    printf("Estado: ");
    scanf("%s",&lista.estado);
    i++;
   }

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

  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);
     printf("Edad:");
     scanf("%d",&lista[c].edad);
     printf("Estado:");
     scanf("%s",&lista[c].estado);
   }

  alumnos despliegues()
   {
     printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
     scanf("%d",&ver);
     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-1;j++)
         {
           printf("nombre: %s\n",lista[j].nombre);
           printf("edad: %d\n",lista[j].edad);
           printf("estado: %s\n",lista[j].estado);
         }
       }
   }

amchacon

Pues hombre, desde el punto de vista de la programación y siendo sincero. Tu programa tiene muchos fallos y errores de concepto.

Partamos desde el principio:

Código (cpp) [Seleccionar]
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>


No necesitas la librería conio, es más, no deberías usarla nunca (es una librería de Windows y hay que intentar hacer los programas multiplataforma).

Código (cpp) [Seleccionar]
struct alumnos
{
      char nombre[10];
      char estado [5];
      int edad;
};

alumnos lista[10];


Esta sentencia solo funciona en C++. En C tendrías que poner struct al lado de lista.

Código (cpp) [Seleccionar]

int i=1;// variable altas y despliegues
int b; // variable bajas
int c; // variable cambios
int ver,j,w ; //variables despliegues
int x; // variable while(despliegues)
int op; // switch
int h; // variable while (switch)



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

main()
{


Variables globales? No son una buena opción, por otro lado esas funciones no retornan nada por lo que deben ser declaradas como void.

El main() debe ser int main() y retornar 0 al final. Está claro que así también funciona pero se carga el estándar y pierdes la facilidad de comunicar errores al SO.

Código (cpp) [Seleccionar]
printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
   scanf("%d",&x);

  }while(x==1);

Si pulsas cualquier otra tecla (2,3,5...) el programa también saldrá.

Código (cpp) [Seleccionar]
alumnos altas()
  {
   printf("Nombre: ");
   scanf("%s",&lista.nombre);
   printf("Edad: ");
   scanf("%d",&lista.edad);
   printf("Estado: ");
   scanf("%s",&lista.estado);
   i++;
  }

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

Además de lo de "alumnos" (esas funciones son void), está el uso de variables globales.

Es importante evitar las variables globales y tirar de parametros. No voy a explanarme mucho pero son una fuente de errores impresionante, además están muy mal vistas (lo que influye de cara al profesor).

Este es mi propuesta de código:

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

#define ACTIVO 1
#define INACTIVO 0

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

Alumnos altas();
void cambios(Alumnos* entrada);
void despliegues(Alumnos* lista,int MAX);

int main()
{
   Alumnos lista[10];
   int op; // switch
   int Candidatos = 0;
   int x;

   do
   {
       printf("\nseleccione una de las opciones\n1.-altas\n2.-bajas\n3.-cambios\n4.-despliegues\n");
       scanf("%d",&op);

       switch (op)
       {
           do
           {
               lista[Candidatos] = altas();
               Candidatos++;
               printf("¿Quiere dar de alta ha alguien mas?\n");
               printf("Si la respuesta es si presione 1\npara salir presione 2\n");
               scanf("%d ",&x);
           }
           while(x==1);
           break;
       case 2:
           printf("alumno que desea dar de baja\n");
           scanf("%d",&x);
           lista[x].estado = INACTIVO;
           break;
       case 3:
           printf("Que alumno desea modificar\n");
           scanf("%d",&x);
           cambios(&lista[x]);
           break;
       case 4:
           despliegues(lista,Candidatos);
           break;
       }
       printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
       scanf("%d",&x);

   }
   while(x==1);

   return 0;
}

Alumnos altas()
{
   Alumnos auxiliar;

   printf("Nombre: ");

   fgets(auxiliar.nombre,10,stdin);

   printf("Edad: ");
   scanf("%d ",&auxiliar.edad);

   auxiliar.estado = ACTIVO;

   /*printf("Estado: ");
   scanf("%s",&auxiliar.estado);
*/
   return auxiliar;
}

void cambios(Alumnos* entrada)
{
   printf("Datos actuales:\nnombre: %s\n",entrada->nombre);
   printf("edad: %d\n",entrada->edad);
   printf("estado:%d",entrada->estado);

   printf("\nIngresar nuevos datos");
   printf("\nNombre: ");
   fgets(entrada->nombre,10,stdin);
   printf("Edad:");
   fgets(entrada->nombre,10,stdin);
   printf("Estado (0 para inactivo y 1 para activo) :");
   scanf("%d",&entrada->estado);
}

void despliegues(Alumnos* lista,int MAX)
{
   int j; //variables despliegues

   printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
   scanf("%d",&j);

   if (j==1)
   {
       printf("Alumno al cual quiere visualizar\n");
       scanf("%d",&j);
       printf("nombre: %s\n",lista[j].nombre);
       printf("edad: %d\n",lista[j].edad);
       printf("estado: %d\n",lista[j].estado);
   }
   else
   {
       printf("Todos los datos son:\n");
       for (j=0; j<=MAX; j++)
       {
           printf("nombre: %s\n",lista[j].nombre);
           printf("edad: %d\n",lista[j].edad);
           printf("estado: %s\n",lista[j].estado);
       }
   }
}


(Desconozco las cosas que habeís dado, asi que he usado todo lo que estaba en mi mano).

En cuanto a guardar los datos, te valdría una función como esta:

void Guardar(Alumnos* Datos,int MAX)
{
  FILE* Fichero = fopen("Salida.txt","wb");
  int i = 0;

 for (i = 0; i < MAX; i++)
 {
     write(Datos[i].nombre,strlen(Datos[i].nombre),sizeof(nombre),Fichero);
     write(Datos[i].estado,1,sizeof(int),Fichero);
     write(Datos[i].edad,1,sizeof(int),Fichero);
     fprintf(Fichero,"\n \n"); // Saltos de linea
 }

 fclose(Fichero);
}


Siendo "Datos" el vector de datos y MAX los elementos que hay.
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

Enserio muchas gracias por tu ayuda soy un principiante y te agradezco mucho tu ayuda, una duda sabes como modificar archivos en este caso para este programa

rir3760

Cita de: amchacon en 13 Mayo 2013, 23:01 PMEn cuanto a guardar los datos, te valdría una función como esta:

void Guardar(Alumnos* Datos,int MAX)
{
   FILE* Fichero = fopen("Salida.txt","wb");
   int i = 0;

  for (i = 0; i < MAX; i++)
  {
      write(Datos[i].nombre,strlen(Datos[i].nombre),sizeof(nombre),Fichero);
      write(Datos[i].estado,1,sizeof(int),Fichero);
      write(Datos[i].edad,1,sizeof(int),Fichero);
      fprintf(Fichero,"\n \n"); // Saltos de linea
  }

  fclose(Fichero);
}


Siendo "Datos" el vector de datos y MAX los elementos que hay.
Tengo la impresión de que la función que pensabas utilizar para escribir los datos es "fwrite" ("write" seria solo un error ortográfico). ¿Estoy en lo correcto?

Si ese es el caso es mas fácil simplemente imprimir todo el contenido del array con una sola llamada (a fwrite):
void Guardar(Alumnos *Datos, int MAX)
{
   FILE *salida;
   
   if ((salida = fopen("Salida.txt", "wb")) == NULL)
      perror("Salida.txt");
   else {
      fwrite(Datos, sizeof *Datos, MAX, salida);
      fclose(salida);
   }
}


O si se quiere almacenar la información como texto se puede utilizar un bucle e imprimir cada uno de los registros mediante fprintf (un campo por linea).

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

juanks92

Hola estuve compilando tu programa y corregi unos errores pero al dar altas y correr el programa tiene fallos como el nombre no lo puedo escribir y no puedo dar de alta a varias personas sabes cual fue el error e intentado corregirlo pero no puedo podrian ayidarme lo q corregi fue q no tenia el case 1 y se lo puse

amchacon

Vale, eso me pasa por no testear *_*

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

#define ACTIVO 1
#define INACTIVO 0

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

Alumnos altas();
void cambios(Alumnos* entrada);
void despliegues(Alumnos* lista,int MAX);

int main()
{
    Alumnos lista[10];
    int op; // switch
    int Candidatos = 0;
    int x;

    do
    {
        printf("\nseleccione una de las opciones\n1.-altas\n2.-bajas\n3.-cambios\n4.-despliegues\n");
        scanf("%d",&op);

        switch (op)
        {
            case 1:
            do
            {
                lista[Candidatos] = altas();
                Candidatos++;
                printf("\nQuiere dar de alta ha alguien mas?\n");
                printf("Si la respuesta es si presione 1\npara salir presione 2\n");
                scanf("%d",&x);
                printf("\nIntroduzca otro pues \n\n");
            }
            while(x==1);
            break;
        case 2:
            printf("alumno que desea dar de baja\n");
            scanf("%d",&x);
            lista[x].estado = INACTIVO;
            break;
        case 3:
            printf("Que alumno desea modificar\n");
            scanf("%d",&x);
            cambios(&lista[x]);
            break;
        case 4:
            despliegues(lista,Candidatos);
            break;
        }
        printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
        scanf("%d",&x);

    }
    while(x==1);

    return 0;
}

Alumnos altas()
{
    Alumnos auxiliar;

    printf("Nombre: ");
    scanf(" ");

    fgets(auxiliar.nombre,10,stdin);

    printf("Edad: ");
    scanf("%d",&auxiliar.edad);

    auxiliar.estado = ACTIVO;

    /*printf("Estado: ");
    scanf("%s",&auxiliar.estado);
*/
    return auxiliar;
}

void cambios(Alumnos* entrada)
{
    printf("Datos actuales:\nnombre: %s\n",entrada->nombre);
    printf("edad: %d\n",entrada->edad);
    printf("estado:%d",entrada->estado);

    printf("\nIngresar nuevos datos");
    printf("\nNombre: ");
    fgets(entrada->nombre,10,stdin);
    printf("Edad:");
    fgets(entrada->nombre,10,stdin);
    printf("Estado (0 para inactivo y 1 para activo) :");
    scanf("%d",&entrada->estado);
}

void despliegues(Alumnos* lista,int MAX)
{
    int j; //variables despliegues

    printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
    scanf("%d",&j);

    if (j==1)
    {
        printf("Alumno al cual quiere visualizar\n");
        scanf("%d",&j);
        printf("nombre: %s\n",lista[j].nombre);
        printf("edad: %d\n",lista[j].edad);
        printf("estado: %d\n",lista[j].estado);
    }
    else
    {
        printf("Todos los datos son:\n");
        for (j=0; j<=MAX; j++)
        {
            printf("nombre: %s\n",lista[j].nombre);
            printf("edad: %d\n",lista[j].edad);
            printf("estado: %s\n",lista[j].estado);
        }
    }
}


Se me ha olvidado el case 1. Además los espacios en el scanf sobran.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar