• Pasar estructura a archivo fuera del main[C]

 #470468  por RDV
 12 May 2015, 00:01
Hola gente.
Estoy aprendiendo a modular programas, el caso es que me da el siguiente error. Error: nombre de tipo desconocido ‘Fecha’, en las líneas 3:14 y 3:28.-
No sé porque me ocurre dado que la variable *totalDias la toma correctamente.-
Es todo lo que puedo aportar por el momento.-
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include "fechaDifDias.c"

#define MENSAJE printf( "\n\n Pulse [Enter] para continuar..." ); getchar(); 

typedef struct{
	int orden;
	char b;
	char fecha[11];
	float verduras;
	float almacen;
	char nota[101];
}Super;

typedef struct{
	int dia;
	int mes;
	int anio;
}Fecha;

int mainMenu(void);
void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper );
void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe);
void escribir_archivo(FILE *ptrFile, Super *super, int tamStructSuper, int registros);
void leer_archivo(FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper);
void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer);
int resBusqueda(Super *super);
void consultation(FILE *ptrFile, Super *super, int tamStructSuper);
int validarFechas(  Fecha inicio, Fecha final, Fecha consulta );
void feDiDi( Fecha inicio, Fecha final, int *totalDias );

int main(void){
	mainMenu();

	return 0;
}


int mainMenu(void){
	Super super = {0};
	int ok, ch, opcMp, registros, contarReg=1, cualLeer=1, opcRe;
	int tamStructSuper = sizeof(int) + sizeof(char) + (sizeof(char)*11) + sizeof(float) + sizeof(float) + (sizeof(char)*101); 
	
	FILE *ptrFile;
	if(( ptrFile = fopen( "gastos.txt", "ab+" ) ) == NULL){
		perror( "\n\n error" );
		return 1;
	}	

	while( opcMp != 8){
		do{
			system( "cls" );

			if( contarReg == 1 ){
				contarRegistros( ptrFile, &super, &registros, tamStructSuper );
				leer_archivo( ptrFile, &super, registros, cualLeer , tamStructSuper);
				contarReg = 0;
				cualLeer = 1;
			}
			
			printf( "\n\n ========== Men%c principal ===========", 163 );
	
			printf( "\n\n 1 - Buscar" );
			printf( "\n 2 - Agregar" );
			printf( "\n 3 - Modificar" );
			printf( "\n 4 - Borrar" );
			printf( "\n 5 - Consulta" );
			printf( "\n 6 - Marcados para borrar" );
			printf( "\n 7 - Empaquetar tabla" );
			printf( "\n 8 - Finalizar" );
	
			printf( "\n\n Ingrese opci%cn.....: ", 162 );
			ok = scanf( "%d", &opcMp) == 1 && opcMp >=1 && opcMp <=8;
			while ((ch = getchar()) != EOF && ch != '\n');
		}while(!ok);
	
		switch(opcMp){
			case 1 :
				if( registros >= 1){
					buscar(ptrFile, &super, tamStructSuper, &contarReg, &cualLeer);	
				}else{
					printf( "\n\n No tiene ningun movimiento grabado" );
					MENSAJE;
				}
				break;
			case 2 :
				rellenar_estructura( ptrFile, &super, &opcRe );
				if( opcRe == 1 ){
					super.b = '+';
					escribir_archivo(ptrFile, &super, tamStructSuper, registros);
					contarReg = 1;
				}
				break;
			case 3 :
				break;
			case 4 :
				break;
			case 5 :
				consultation( ptrFile, &super, tamStructSuper );
				contarReg = 1;
				break;
			case 6 :
				break;
			case 7 :
				break;
		}
	}
	
	fclose( ptrFile );
	return 0;	
}

void contarRegistros( FILE *ptrFile, Super *super, int *registros, int tamStructSuper ){
	fseek( ptrFile, 0, SEEK_END );
	*registros =  ftell( ptrFile ) / tamStructSuper;
}

void rellenar_estructura(FILE *ptrFile, Super *super, int *opcRe){
	int ch, ok;
	char *p = NULL;

	time_t tiempo = time(0);
	struct tm *tlocal = localtime(&tiempo);
	char fecha[11];
	strftime(fecha,11,"%d/%m/%Y", tlocal);
	
	printf( "\n ================== Agregar operaci%cn ==================", 162 );
	
	do{
		printf( "\n\n Ingrese fecha (formato ==> %s..................: ", fecha );
		fgets(super->fecha, 11, stdin);
		if((p=strchr(super->fecha, '\n'))){
			*p='\0';
		}
		else{
			while((ch = getchar()) !='\n' && ch!=EOF);
		}
		ok = strlen(super->fecha);
		if( ok != 10 || super->fecha[2] != '/' || super->fecha[5] != '/'){			
			ok = 0;
		}
	}while(ok !=10);
	
	do{
		printf( "\n Ingrese importe gastado en verduler%ca (0 = sin gasto)..: ", 161 );
		ok = scanf( "%f", &super->verduras) == 1 && super->verduras >= 0; 
		while ((ch = getchar()) != EOF && ch != '\n');
	}while(!ok);
	
	do{
		printf( "\n Ingrese importe gastado en almac%cn (0 = sin gasto).....: ", 130 );
		ok = scanf( "%f", &super->almacen) == 1 && super->almacen >= 0; 
		while ((ch = getchar()) != EOF && ch != '\n');
	}while(!ok);

	printf( "\n Ingrese recordatorio (m%cximo 100 caracteres)...........: ", 160 );
	fgets(super->nota, 101, stdin);
	if((p=strchr(super->nota, '\n'))){
		*p='\0';
	}
	else{
		while((ch = getchar()) !='\n' && ch!=EOF);
	}

	printf( "\n =============== Grabar en base de datos ===============" );
	printf( "\n 1 - Graba" );
	printf( "\n 2 - Descarta" );
	do{
		printf( "\n\n Ingrese opci%cn.....: ", 162 );
		ok = scanf( "%d", opcRe) == 1 && *opcRe >= 1 && *opcRe <= 2;  
		while((ch = getchar()) !='\n' && ch!=EOF);
	}while(!ok);
}

void escribir_archivo( FILE *ptrFile, Super *super, int tamStructSuper, int registros ){
	super->orden = registros + 1;
	fseek( ptrFile, 0, SEEK_END );
	fwrite( super, tamStructSuper, 1, ptrFile );	
}

void leer_archivo( FILE *ptrFile, Super *super, int registros, int cualLeer, int tamStructSuper ){
	float total = 0.0;
	printf( "\n\n =======================================================" );
	printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );	
	
	if(cualLeer == 1){
		rewind( ptrFile);
		while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
			if( super->orden == registros){
				fread( super, tamStructSuper, 1, ptrFile );
			}
		}
	}
	total = super->verduras + super->almacen;
	printf( "\n %11s %12.2f %10.2f %9.2f (total movimientos..: %d)", super->fecha,  super->verduras, super->almacen, total, registros );
	printf( "\n\n =======================================================" );
}

void buscar(FILE *ptrFile, Super *super, int tamStructSuper, int *contarReg, int *cualLeer){
	char pBuscar[11], *p = NULL;
	int ch, ok, opcion;
	
	do{
		printf( "\n\n Ingrese fecha a buscar (formato ==> 11/04/2015)....: " );
		fgets(pBuscar, 11, stdin);
		if((p=strchr(pBuscar, '\n'))){
			*p='\0';
		}
		else{
			while((ch = getchar()) !='\n' && ch!=EOF);
		}
		ok = strlen(pBuscar);
		if( ok != 10 || pBuscar[2] != '/' || pBuscar[5] != '/'){			
			ok = 0;
		}
	}while(!ok);

	ok=0;
	rewind( ptrFile);
	while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
		if( strstr(pBuscar, super->fecha) != NULL){
			ok++;
			opcion = resBusqueda( super );
			if( opcion == 1 ){
				*contarReg = 1;
				*cualLeer = 2;
			}
			else if( opcion == 3 ){
				*contarReg = 1;
				*cualLeer = 1;
			}
			break;
		}
	}
	if( ok == 0){
		printf( "\n\n No existe..." );
		MENSAJE;
	}
}

int resBusqueda( Super *super ){
	float totalBus;
	int opcionEnc, ch, ok;
	
	printf( "\n\n =======================================================" );
	printf( " \n\n  Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );	

	totalBus = super->verduras + super->almacen;
	printf( "\n %11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, totalBus);

	do{
		printf( "\n\n ===== Opciones de lo encontrado =====" );	
		printf( "\n\n  1 - Encontrado" );
		printf( "\n  2 - Continuar..." );
		printf( "\n  3 - Finalizar" );
		printf( "\n\n Ingrese opci%cn.....: ", 162 );
		ok = scanf( "%d", &opcionEnc) == 1 && opcionEnc >= 1 && opcionEnc <= 3;
		while ((ch = getchar()) != EOF && ch != '\n');
	}while(!ok);
		
	return opcionEnc;
}

void consultation(FILE *ptrFile, Super *super, int tamStructSuper){
	Fecha inicio;
	Fecha final;
	Fecha consulta;
	int ok, vFecha, ch, totalDias=0;
	float totalVer = 0.00, totalAlm = 0.00, subTotal = 0.00, totalCon = 0.00; 
	
	printf( "\n\n Ingrese INICIO de la consulta (formato ==> 11/04/2015)....: " );
	scanf("%d/%d/%d", &inicio.dia, &inicio.mes, &inicio.anio);
	while ((ch = getchar()) != EOF && ch != '\n');
	
	printf( "\n\n Ingrese FINAL de la consulta (formato ==> 11/04/2015).....: " );
	scanf("%d/%d/%d", &final.dia, &final.mes, &final.anio);
	while ((ch = getchar()) != EOF && ch != '\n');

	printf( "\n\n =======================================================" );
	printf( " \n\n Fecha        Verduler%ca    Almac%cn     Total", 161, 130 );	

	ok=0;
	rewind( ptrFile);
	while( fread( super, tamStructSuper, 1, ptrFile ) == 1 ){
		sscanf( super->fecha, "%d/%d/%d", &consulta.dia, &consulta.mes, &consulta.anio );
		vFecha = validarFechas( inicio , final, consulta );
		if( vFecha == 1 ){
			ok++;	
			totalVer += super->verduras;
			totalAlm += super->almacen;
			subTotal = super->almacen + super->verduras;
			totalCon += subTotal;
			printf( "\n%11s %12.2f %10.2f %9.2f", super->fecha,  super->verduras, super->almacen, subTotal);
		}
	}
	if( ok > 0 ){
		feDiDi(	inicio, final, &totalDias );
		printf( "\n\n Totales %15.2f%11.2f%10.2f", totalVer, totalAlm, totalCon);
	}else{
		printf( "\n\n No  hay movimientos..." );
	}
	MENSAJE;		
}

int validarFechas(  Fecha inicio, Fecha final, Fecha consulta ){
	unsigned long _inicio = (inicio.anio * 365) + (inicio.mes * 28) + inicio.dia;
	unsigned long fin = (final.anio * 365) + (final.mes * 28) + final.dia;
	unsigned long fecha = (consulta.anio * 365) + (consulta.mes * 28) + consulta.dia;
   
	if( fecha >= _inicio && fecha <= fin ){
        return 1;
    }else{
        return 0;
    } 
}
int numeroBisiestos( int anio );

void feDiDi( Fecha inicio, Fecha final, int *totalDias ){
	int totalDiasAnio[] = {00,31,59,90,120,151,181,212,243,273,304,334,365};
	int difAnio=0, i;
	
	difAnio = final.anio - inicio.anio;
	
	if( difAnio == 0){
		*totalDias += (totalDiasAnio[final.mes-1] + final.dia) - (totalDiasAnio[inicio.mes-1] + inicio.dia);	
		if( inicio.mes <= 2 && final.mes > 2) {*totalDias += numeroBisiestos(inicio.anio);}
	}
	else{
		*totalDias += 365 - (totalDiasAnio[inicio.mes-1] + inicio.dia);
		if( inicio.mes < 3) {*totalDias += numeroBisiestos(inicio.anio);}
		
		for( i= inicio.anio +1; i< final.anio; i++ ){
			*totalDias += 365 + numeroBisiestos(i);
		}
		
		*totalDias += totalDiasAnio[final.mes-1] + final.dia;
		if( final.mes > 2) {*totalDias += numeroBisiestos(final.anio);}
	}
}

int numeroBisiestos( int anio ){
	if((anio %4 == 0 && anio%100 != 0) || (anio%400) == 0){return 1;}
	else{return 0;}
}
Desde ya muchas gracia por el tiempo que le dediquen al tema.-
Daniel