Autor
|
Tema: Archivos (Leído 2,127 veces)
|
juanks92
Desconectado
Mensajes: 14
|
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
Mensajes: 1.211
|
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: #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). 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. 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. 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á. 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"); 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"); } while(x==1); break; case 2: printf("alumno que desea dar de baja\n"); lista[x].estado = INACTIVO; break; case 3: printf("Que alumno desea modificar\n"); cambios(&lista[x]); break; case 4: despliegues(lista,Candidatos); break; } printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n"); } while(x==1); return 0; } Alumnos altas() { Alumnos auxiliar; fgets(auxiliar. nombre,10,stdin ); 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"); fgets(entrada ->nombre ,10,stdin ); 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"); if (j==1) { printf("Alumno al cual quiere visualizar\n"); 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 } }
Siendo "Datos" el vector de datos y MAX los elementos que hay.
|
|
|
En línea
|
|
|
|
juanks92
Desconectado
Mensajes: 14
|
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
Mensajes: 1.639
|
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 } }
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 ) else { fwrite(Datos , sizeof *Datos , MAX , 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
|
|
|
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
Mensajes: 14
|
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
Mensajes: 1.211
|
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"); 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"); printf("\nIntroduzca otro pues \n\n"); } while(x==1); break; case 2: printf("alumno que desea dar de baja\n"); lista[x].estado = INACTIVO; break; case 3: printf("Que alumno desea modificar\n"); cambios(&lista[x]); break; case 4: despliegues(lista,Candidatos); break; } printf("Presione 1 para regresar al menu anterior\nPresione alt F4 para salir\n"); } while(x==1); return 0; } Alumnos altas() { Alumnos auxiliar; fgets(auxiliar. nombre,10,stdin ); 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"); fgets(entrada ->nombre ,10,stdin ); 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"); if (j==1) { printf("Alumno al cual quiere visualizar\n"); 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.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
como puedo convertir archivos flash ha archivos de videos
Diseño Gráfico
|
asitaka_kintaro
|
3
|
6,160
|
22 Enero 2006, 23:53 pm
por Morris
|
|
|
Análisis archivos Extensiones cambiadas - Archivos camuflados - Contenido real
« 1 2 »
Software
|
Esgrimidor
|
11
|
9,111
|
24 Septiembre 2011, 01:53 am
por Esgrimidor
|
|
|
Cómo? Modificar archivos de la carpeta archivos de programas en windows 7
« 1 2 »
Windows
|
anonimo12121
|
10
|
22,780
|
10 Abril 2011, 01:02 am
por Songoku
|
|
|
Archivos dañados tras recuperación de archivos cifrados (virus policia)
Seguridad
|
marianchaparro
|
2
|
10,333
|
17 Mayo 2012, 20:06 pm
por r32
|
|
|
Unir archivos y agregar el nombre de archivos a cada linea por MS-DOS
Scripting
|
cialem
|
4
|
5,927
|
18 Julio 2012, 16:13 pm
por cialem
|
|