elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Archivos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Archivos  (Leído 2,128 veces)
juanks92

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Archivos
« en: 13 Mayo 2013, 18:29 pm »

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


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Archivos
« Respuesta #1 en: 13 Mayo 2013, 23:01 pm »

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
  1. #include<stdio.h>
  2. #include<conio.h>
  3. #include<string.h>
  4. #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
  1. struct alumnos
  2. {
  3.       char nombre[10];
  4.       char estado [5];
  5.       int edad;
  6. };
  7.  
  8. alumnos lista[10];

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

Código
  1. int i=1;// variable altas y despliegues
  2. int b; // variable bajas
  3. int c; // variable cambios
  4. int ver,j,w ; //variables despliegues
  5. int x; // variable while(despliegues)
  6. int op; // switch
  7. int h; // variable while (switch)
  8.  
  9.  
  10.  
  11. alumnos altas();
  12. alumnos bajas();
  13. alumnos cambios();
  14. alumnos despliegues();
  15.  
  16. main()
  17. {

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
  1. printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
  2.    scanf("%d",&x);
  3.  
  4.   }while(x==1);
  5.  
Si pulsas cualquier otra tecla (2,3,5...) el programa también saldrá.

Código
  1. alumnos altas()
  2.   {
  3.    printf("Nombre: ");
  4.    scanf("%s",&lista.nombre);
  5.    printf("Edad: ");
  6.    scanf("%d",&lista.edad);
  7.    printf("Estado: ");
  8.    scanf("%s",&lista.estado);
  9.    i++;
  10.   }
  11.  
  12.  alumnos bajas()
  13.   {
  14.     printf("alumno que desea dar de baja\n");
  15.     scanf("%d",&b);
  16.     strcpy(lista.estado,"baja");
  17.   }
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:

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. #define ACTIVO 1
  6. #define INACTIVO 0
  7.  
  8. typedef struct alumnos
  9. {
  10.    char nombre[10];
  11.    int estado;
  12.    int edad;
  13. } Alumnos;
  14.  
  15. Alumnos altas();
  16. void cambios(Alumnos* entrada);
  17. void despliegues(Alumnos* lista,int MAX);
  18.  
  19. int main()
  20. {
  21.    Alumnos lista[10];
  22.    int op; // switch
  23.    int Candidatos = 0;
  24.    int x;
  25.  
  26.    do
  27.    {
  28.        printf("\nseleccione una de las opciones\n1.-altas\n2.-bajas\n3.-cambios\n4.-despliegues\n");
  29.        scanf("%d",&op);
  30.  
  31.        switch (op)
  32.        {
  33.            do
  34.            {
  35.                lista[Candidatos] = altas();
  36.                Candidatos++;
  37.                printf("¿Quiere dar de alta ha alguien mas?\n");
  38.                printf("Si la respuesta es si presione 1\npara salir presione 2\n");
  39.                scanf("%d ",&x);
  40.            }
  41.            while(x==1);
  42.            break;
  43.        case 2:
  44.            printf("alumno que desea dar de baja\n");
  45.            scanf("%d",&x);
  46.            lista[x].estado = INACTIVO;
  47.            break;
  48.        case 3:
  49.            printf("Que alumno desea modificar\n");
  50.            scanf("%d",&x);
  51.            cambios(&lista[x]);
  52.            break;
  53.        case 4:
  54.            despliegues(lista,Candidatos);
  55.            break;
  56.        }
  57.        printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
  58.        scanf("%d",&x);
  59.  
  60.    }
  61.    while(x==1);
  62.  
  63.    return 0;
  64. }
  65.  
  66. Alumnos altas()
  67. {
  68.    Alumnos auxiliar;
  69.  
  70.    printf("Nombre: ");
  71.  
  72.    fgets(auxiliar.nombre,10,stdin);
  73.  
  74.    printf("Edad: ");
  75.    scanf("%d ",&auxiliar.edad);
  76.  
  77.    auxiliar.estado = ACTIVO;
  78.  
  79.    /*printf("Estado: ");
  80.     scanf("%s",&auxiliar.estado);
  81. */
  82.    return auxiliar;
  83. }
  84.  
  85. void cambios(Alumnos* entrada)
  86. {
  87.    printf("Datos actuales:\nnombre: %s\n",entrada->nombre);
  88.    printf("edad: %d\n",entrada->edad);
  89.    printf("estado:%d",entrada->estado);
  90.  
  91.    printf("\nIngresar nuevos datos");
  92.    printf("\nNombre: ");
  93.    fgets(entrada->nombre,10,stdin);
  94.    printf("Edad:");
  95.    fgets(entrada->nombre,10,stdin);
  96.    printf("Estado (0 para inactivo y 1 para activo) :");
  97.    scanf("%d",&entrada->estado);
  98. }
  99.  
  100. void despliegues(Alumnos* lista,int MAX)
  101. {
  102.    int j; //variables despliegues
  103.  
  104.    printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
  105.    scanf("%d",&j);
  106.  
  107.    if (j==1)
  108.    {
  109.        printf("Alumno al cual quiere visualizar\n");
  110.        scanf("%d",&j);
  111.        printf("nombre: %s\n",lista[j].nombre);
  112.        printf("edad: %d\n",lista[j].edad);
  113.        printf("estado: %d\n",lista[j].estado);
  114.    }
  115.    else
  116.    {
  117.        printf("Todos los datos son:\n");
  118.        for (j=0; j<=MAX; j++)
  119.        {
  120.            printf("nombre: %s\n",lista[j].nombre);
  121.            printf("edad: %d\n",lista[j].edad);
  122.            printf("estado: %s\n",lista[j].estado);
  123.        }
  124.    }
  125. }
  126.  

(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:

Código
  1. void Guardar(Alumnos* Datos,int MAX)
  2. {
  3.   FILE* Fichero = fopen("Salida.txt","wb");
  4.   int i = 0;
  5.  
  6.  for (i = 0; i < MAX; i++)
  7.  {
  8.      write(Datos[i].nombre,strlen(Datos[i].nombre),sizeof(nombre),Fichero);
  9.      write(Datos[i].estado,1,sizeof(int),Fichero);
  10.      write(Datos[i].edad,1,sizeof(int),Fichero);
  11.      fprintf(Fichero,"\n \n"); // Saltos de linea
  12.  }
  13.  
  14.  fclose(Fichero);
  15. }

Siendo "Datos" el vector de datos y MAX los elementos que hay.


En línea

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

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Archivos
« Respuesta #2 en: 14 Mayo 2013, 01:30 am »

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
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Archivos
« Respuesta #3 en: 14 Mayo 2013, 02:40 am »

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

Código
  1. void Guardar(Alumnos* Datos,int MAX)
  2. {
  3.   FILE* Fichero = fopen("Salida.txt","wb");
  4.   int i = 0;
  5.  
  6.  for (i = 0; i < MAX; i++)
  7.  {
  8.      write(Datos[i].nombre,strlen(Datos[i].nombre),sizeof(nombre),Fichero);
  9.      write(Datos[i].estado,1,sizeof(int),Fichero);
  10.      write(Datos[i].edad,1,sizeof(int),Fichero);
  11.      fprintf(Fichero,"\n \n"); // Saltos de linea
  12.  }
  13.  
  14.  fclose(Fichero);
  15. }

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):
Código
  1. void Guardar(Alumnos *Datos, int MAX)
  2. {
  3.   FILE *salida;
  4.  
  5.   if ((salida = fopen("Salida.txt", "wb")) == NULL)
  6.      perror("Salida.txt");
  7.   else {
  8.      fwrite(Datos, sizeof *Datos, MAX, salida);
  9.      fclose(salida);
  10.   }
  11. }

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
En línea

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

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: Archivos
« Respuesta #4 en: 14 Mayo 2013, 03:50 am »

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
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Archivos
« Respuesta #5 en: 14 Mayo 2013, 23:01 pm »

Vale, eso me pasa por no testear *_*

Código
  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4.  
  5. #define ACTIVO 1
  6. #define INACTIVO 0
  7.  
  8. typedef struct alumnos
  9. {
  10.    char nombre[10];
  11.    int estado;
  12.    int edad;
  13. } Alumnos;
  14.  
  15. Alumnos altas();
  16. void cambios(Alumnos* entrada);
  17. void despliegues(Alumnos* lista,int MAX);
  18.  
  19. int main()
  20. {
  21.    Alumnos lista[10];
  22.    int op; // switch
  23.    int Candidatos = 0;
  24.    int x;
  25.  
  26.    do
  27.    {
  28.        printf("\nseleccione una de las opciones\n1.-altas\n2.-bajas\n3.-cambios\n4.-despliegues\n");
  29.        scanf("%d",&op);
  30.  
  31.        switch (op)
  32.        {
  33.            case 1:
  34.            do
  35.            {
  36.                lista[Candidatos] = altas();
  37.                Candidatos++;
  38.                printf("\nQuiere dar de alta ha alguien mas?\n");
  39.                printf("Si la respuesta es si presione 1\npara salir presione 2\n");
  40.                scanf("%d",&x);
  41.                printf("\nIntroduzca otro pues \n\n");
  42.            }
  43.            while(x==1);
  44.            break;
  45.        case 2:
  46.            printf("alumno que desea dar de baja\n");
  47.            scanf("%d",&x);
  48.            lista[x].estado = INACTIVO;
  49.            break;
  50.        case 3:
  51.            printf("Que alumno desea modificar\n");
  52.            scanf("%d",&x);
  53.            cambios(&lista[x]);
  54.            break;
  55.        case 4:
  56.            despliegues(lista,Candidatos);
  57.            break;
  58.        }
  59.        printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n");
  60.        scanf("%d",&x);
  61.  
  62.    }
  63.    while(x==1);
  64.  
  65.    return 0;
  66. }
  67.  
  68. Alumnos altas()
  69. {
  70.    Alumnos auxiliar;
  71.  
  72.    printf("Nombre: ");
  73.    scanf(" ");
  74.  
  75.    fgets(auxiliar.nombre,10,stdin);
  76.  
  77.    printf("Edad: ");
  78.    scanf("%d",&auxiliar.edad);
  79.  
  80.    auxiliar.estado = ACTIVO;
  81.  
  82.    /*printf("Estado: ");
  83.     scanf("%s",&auxiliar.estado);
  84. */
  85.    return auxiliar;
  86. }
  87.  
  88. void cambios(Alumnos* entrada)
  89. {
  90.    printf("Datos actuales:\nnombre: %s\n",entrada->nombre);
  91.    printf("edad: %d\n",entrada->edad);
  92.    printf("estado:%d",entrada->estado);
  93.  
  94.    printf("\nIngresar nuevos datos");
  95.    printf("\nNombre: ");
  96.    fgets(entrada->nombre,10,stdin);
  97.    printf("Edad:");
  98.    fgets(entrada->nombre,10,stdin);
  99.    printf("Estado (0 para inactivo y 1 para activo) :");
  100.    scanf("%d",&entrada->estado);
  101. }
  102.  
  103. void despliegues(Alumnos* lista,int MAX)
  104. {
  105.    int j; //variables despliegues
  106.  
  107.    printf("Presione 1 para ver un dato\nPresione otra tecla para ver todos los datos\n");
  108.    scanf("%d",&j);
  109.  
  110.    if (j==1)
  111.    {
  112.        printf("Alumno al cual quiere visualizar\n");
  113.        scanf("%d",&j);
  114.        printf("nombre: %s\n",lista[j].nombre);
  115.        printf("edad: %d\n",lista[j].edad);
  116.        printf("estado: %d\n",lista[j].estado);
  117.    }
  118.    else
  119.    {
  120.        printf("Todos los datos son:\n");
  121.        for (j=0; j<=MAX; j++)
  122.        {
  123.            printf("nombre: %s\n",lista[j].nombre);
  124.            printf("edad: %d\n",lista[j].edad);
  125.            printf("estado: %s\n",lista[j].estado);
  126.        }
  127.    }
  128. }
  129.  

Se me ha olvidado el case 1. Además los espacios en el scanf sobran.
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines