Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema al imprimir datos de FICHERO

Estas en el tema de Problema al imprimir datos de FICHERO en el foro de C/C++ en Foros del Web. HOLA! Muy buenos dias tengan todos ustedes Bueno mi duda es la siguiente: Hice un programa en Lenguaje C el cual consiste en que guarda ...
  #1 (permalink)  
Antiguo 26/04/2012, 08:14
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 3 meses
Puntos: 1
Problema al imprimir datos de FICHERO

HOLA! Muy buenos dias tengan todos ustedes

Bueno mi duda es la siguiente:

Hice un programa en Lenguaje C el cual consiste en que guarda una lista de alumnos con su matricula y sus respectivas 3 calificaciones y bueno se va guardando en un fichero, ahora bien, en una del menú que se imprime, se guardan en otro archivo solo los alumnos aprobados o reprobados. La opción final es imprimir los datos del otro archivo, y lo hace, excepto que no imprime el nombre del alumno y parece que el error está a la hora de copiar los datos.

Bueno aqui les dejo mi codigo, y les AGRADEZCO la ayuda


Código:
#include <stdio.h>
#define mx 40

typedef struct {
	int mat, c[3];
	char nom[];
} reg;

reg altas[mx], apr[mx];

leef(char arch[], reg altas[], int *tamano) {
	int i = 0, p = 0;
	FILE *fp;
	if((fp = fopen(arch,"a+b")) == NULL)
		printf("Error en la lectura del archivo.\n");
	else {
		fread(&altas[i], sizeof(reg), 1, fp);
			while(!feof(fp)) {
				fread(&altas[i++], sizeof(reg), 1, fp);
				p++;
			}
		fclose(fp);
		*tamano = p;
	}
}

creaf(char arch[], reg altas[], int tamano) {
	int i = 0;
	FILE *fp;
	if((fp = fopen(arch, "wb")) == NULL)
		printf("Error en la escritura del archivo.\n");
	else {
		fwrite(&altas[i], sizeof(reg), 1, fp);
		for(i = 0; i < tamano; i++)
			fwrite(&altas[i], sizeof(reg), 1, fp);
		fclose(fp);
	}
}

char menu () {
	char r;
	printf("\nSeleccione una opcion...\n\n");
	printf("A>lmacenar.\n");
	printf("C>onsultar.\n");
	printf("S>alir.\n");
	r = tolower(getchar());
	getchar();
	return r;
}

char smenu () {
	char r;
	printf("\nSeleccione una opcion...\n\n");
	printf("A>probados.\n");
	printf("R>eprobados.\n");
	printf("S>alir.\n");
	r = tolower(getchar());
	getchar();
	return r;
}

float prom(int cal[]) {
	int i;
	float s = 0;
	for (i = 0; i < 3; i++)
		s += cal[i];
	return s / 3;
}
		

main () {
	int i = 0, j, p = 0, a, f = 0;
	char  r = 's', r1 = 's';
	printf("Lista de alumnos.\n\n\n");
	printf("Dame la matricula del alumno %d:    ", i + 1);
	scanf("%d%*c", &altas[i].mat);
	while(altas[i].mat != 0) {
		printf("Dame el nombre:    ");
		gets(altas[i].nom);
		for(j = 0; j < 3; j++){
			printf("\nDame la calificacion %d:    ", j + 1);
			scanf("%d%*c", &altas[i].c[j]);
		}
		p++;
		i++;
		printf("\n\nDame la matricula del alumno %d:    ", i + 1);
		scanf("%d%*c", &altas[i].mat);
	}
	creaf("lista.dat", altas, p);
	do {
		switch (menu()) {
			case 'a':
				r1 = 's';
				if(p == 0)
					printf("El archivo esta vacio.\n");
				else {
					do {
						switch(smenu()) {
							case 'a':
								a = 0;
								for(i = 0; i < p; i++)
									if(prom(altas[i].c) >= 6){
										apr[a].mat = altas[i].mat;
										strcpy(altas[i].nom, apr[a].nom);
										for(j=0;j<3;j++)
											apr[a].c[j]=altas[i].c[j];
										a++;
									}
								creaf("otro.dat", apr, a - 1);
								printf("Alumnos aprobados almacenados.\n");
								f = 1;
								break;
							case 'r':
								a = 0;
								for(i = 0; i < p; i++)
									if(prom(altas[i].c) < 6){
										apr[a] = altas[i];
										a++;
									}
								creaf("otro.dat", apr, a - 1);
								printf("Alumnos reprobados almacenados.\n");
								f = 2;
								break;
							case 's':
								r1 = 'n';
								break;
							default:
								printf("Opcion incorrecta.\n");
								break;
						}
					}
					while(r1 == 's');
				}
				break;
			case 'c':
				if(f == 0 || a == 0)
					printf("El archivo esta vacio.\n");
				else {
					leef("otro.dat", apr, &a);
					if(f == 1)
						printf("Lista de alumnos aprobados:\n\n");
					else 
						printf("lista de alumnos reprobados:\n\n");
					for(i = 0; i < a; i++) {
						printf("Matricula:    %d\n", apr[i].mat);
						printf("Nombre:    ");
						puts(apr[i].nom);
						printf("\nCalificaciones:   1.- %d  2.- %d  3.- %d\n\n", apr[i].c[0], apr[i].c[1], apr[i].c[2]);
					}
				}
				break;
			case 's':
				r = 'n';
				break;
			default: printf("Opcion incorrecta.\n");
				break;	
		}
	}
	while(r == 's');		
}
  #2 (permalink)  
Antiguo 26/04/2012, 09:47
 
Fecha de Ingreso: diciembre-2011
Ubicación: CABA
Mensajes: 433
Antigüedad: 12 años, 4 meses
Puntos: 94
Respuesta: Problema al imprimir datos de FICHERO

Hola! tenes dos errores: uno esta en la declaracion de la estructura, no le asignas el tamaño al arreglo nom....... nom[TAMANO];
y el otro esta en strcpy, estan mal los parametros, es al reves
Código C:
Ver original
  1. strcpy(apr[a].nom, altas[i].nom);

Saludos

PD: usa variables con nombres mas representativos, evita esto de a, f, p hace mas dificil de leer el codigo
  #3 (permalink)  
Antiguo 27/04/2012, 23:33
 
Fecha de Ingreso: febrero-2012
Mensajes: 56
Antigüedad: 12 años, 3 meses
Puntos: 1
Respuesta: Problema al imprimir datos de FICHERO

Muchisimas gracias carnal, deberas que que errores tan mas absurdos xD debe ser el estres, pero bueno.


Ahora bien, en estos momentos me encuentro haciendo una funcion recursiva, la cual va asi:

Código:
int bin (int n) {
if(n==0) {
        printf("El numero binario es:       ");
        return 0;
}
else {
        printf("%d",bin(n/2));
        return n%2;
}
}
SE SUPONE QUE: la funcion esta le das un numero normal (en decimal) y te lo convierte a numero binario, y a la hora de usarle, todo bien, sin embargo, siempre me imprime un "0" de mas del lado izquierdo, y no me gusta eso, no me sirve de nada ese 0

Haciendo pruebas me di cuenta que es el "0" que esta en el primer return, sin embargo, al quitarlo, me imprime un 27 hasta el inicio, osea ¿QUE TIENE QUE VER EL 27!!!?

Les agradeceria me dijeran en que esta el error y que cuando quiera ver el binario de 13, me imprima algo como esto: 1101 y no algo como esto: 01101


GRACIAS
  #4 (permalink)  
Antiguo 28/04/2012, 05:51
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: Problema al imprimir datos de FICHERO

Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. void bin (int n) {
  4.     if(n==0) {
  5.             printf("0");
  6.             return ;
  7.     }
  8.     else if (n==1) {
  9.         printf("1");
  10.         return ;
  11.     }
  12.     else {
  13.             bin(n/2);
  14.             printf("%d",n%2);
  15.             return;
  16.     }
  17. }
  18.  
  19.  
  20. int main()
  21. {
  22.     bin(13);
  23.  
  24. }

Antes no funcionaba porque no tenias el caso base del uno asi que con uno se volvia a llamar y ahi te mostraba el cero.... y siempre tiraba el primer bit... Fijate que apenas entra imprimia y despues hacia un return n%2;
Ese primer return nunca se mostraba

Saludos

Etiquetas: estructuras, fichero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:03.