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

Ficheros. Compila pero no funciona.

Estas en el tema de Ficheros. Compila pero no funciona. en el foro de C/C++ en Foros del Web. Hola amigos. Aquí vuelvo de nuevo con otro programa que no me funciona. He revisado y cambiado un montón de veces mi código. Alguien puede ...
  #1 (permalink)  
Antiguo 05/06/2006, 10:54
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años, 8 meses
Puntos: 9
Ficheros. Compila pero no funciona.

Hola amigos. Aquí vuelvo de nuevo con otro programa que no me funciona. He revisado y cambiado un montón de veces mi código. Alguien puede ayudarme? Muchas gracias.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define CIERTO 1

struct fecha
{
int mes,dia,anio;
};

struct tregistro
{
char nombre[80];
char calle[80];
char ciudad[80];
int no_cta;
int tipo_cta;
float anterior_saldo;
float nuevo_saldo;
float pago;
struct fecha ultimopago;
};

struct tregistro leerpantalla(tregistro);
struct tregistro actualizar(tregistro);
void escribirarchivo(tregistro);

FILE *antpt,*nuept;
int mes,dia,anio;

main()
{
int INDICADOR=CIERTO;
struct tregistro cliente;

/*Abrir archivos de datos.*/

if((antpt=fopen("registro_ant.txt","r"))=NULL)
printf("\n Error al abrir archivo.");
else
{
nuept=fopen("registro_nue.txt","w");
printf("\n\t SISTEMA DE FACTURACION DE CLIENTES.");
printf("\n\t ACTUALIZACION.\n\n");
printf("\n Introduzca fecha actual(mm/dd/aa): ");
scanf("%d %d %d",&mes,&dia,&anio);
while(INDICADOR)
{
fscanf(antpt,"%s",cliente.nombre);
fprintf(nuept,"\n %s \n",cliente.nombre);
if(strcmp(cliente.nombre,"FIN")==0)
break;
cliente=leerpantalla(cliente);
cliente=actualizar(cliente);
escribirarchivo(cliente);
}
fclose(antpt);
fclose(nuept);
}
}

/*Definiciones de las funciones.*/

struct tregistro leerpantalla(struct tregistro cliente)
{
fscanf(antpt,"%s",cliente.calle);
fscanf(antpt,"%s",cliente.ciudad);
fscanf(antpt,"%d",&cliente.no_cta);
fscanf(antpt,"%c",&cliente.tipo_cta);
fscanf(antpt,"%f",&cliente.anterior_saldo);
fscanf(antpt,"%f",&cliente.nuevo_saldo);
fscanf(antpt,"%f",&cliente.pago);
fscanf(antpt,"%d %d %d",&cliente.ultimopago.mes,&cliente.ultimopago.di a,&cliente.ultimopago.anio);
return(cliente);
}

struct tregistro actualizar(struct tregistro cliente)
{
printf("\n\n\t Nombre: %s",cliente.nombre);
printf("\n\t Numero de cuenta: %d",cliente.no_cta);
printf("\n\t Saldo anterior: %f",cliente.anterior_saldo);
printf("\n\t Pago actual: "); scanf("%f",&cliente.pago);
if(cliente.pago>0)
{
cliente.ultimopago.mes=mes;
cliente.ultimopago.dia=dia;
cliente.ultimopago.anio=anio;
cliente.tipo_cta=(cliente.pago < 0.1 * cliente.anterior_saldo)? 'R':'A';
}
else
cliente.tipo_cta=(cliente.anterior_saldo > 0)? 'D':'A';
cliente.nuevo_saldo=cliente.anterior_saldo - cliente.pago;
printf("\n\t Nuevo saldo: %f",cliente.nuevo_saldo);
printf("\n\t Estado de la cuenta: ");
switch(cliente.tipo_cta)
{
case 'A':
printf("\n\t AL DIA");
break;
case 'R':
printf("\n\t RETRASADA");
break;
case 'D':
printf("\n\t DELINCUENTE");
break;
default:
printf("\n\t ERROR");
}
return(cliente);
}

void escribirarchivo(struct tregistro cliente)
{
fprintf(nuept,"\n %s ",cliente.calle);
fprintf(nuept,"\n %s ",cliente.ciudad);
fprintf(nuept,"\n %d ",cliente.no_cta);
fprintf(nuept,"\n %c ",cliente.tipo_cta);
fprintf(nuept,"\n %f ",cliente.anterior_saldo);
fprintf(nuept,"\n %f ",cliente.nuevo_saldo);
fprintf(nuept,"\n %f ",cliente.pago);
fprintf(nuept,"\n %d %d %d ",cliente.ultimopago.mes,cliente.ultimopago.dia,cl iente.ultimopago.anio);
return;
}


Muchas gracias por su paciencia y ayuda.
  #2 (permalink)  
Antiguo 05/06/2006, 17:03
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
despues de revisar un poco.....
tu programa compila depues de unas correciones de errores de separcion de nombres, que supongo surgieron en el copy-paste.

cl iente, di a, etc.

Una vez ejecutandolo, surgen problemas ya que tu lees un fichero que no existe, y sigues haciendolo.

if((antpt=fopen("registro_ant.txt","r"))=NULL)

fscanf(antpt,"%s",cliente.nombre);

cliente=leerpantalla(cliente);

todas estas operaciones suponen que existe un fichero con datos adecuados.

supongo que tienes que crear una funcion que cree un fichero registro_ant.txt con datos por default.

y esto: if(strcmp(cliente.nombre,"FIN")==0)

supongo que para eso esta el EOF de un fichero, pero bueno, eso es lo que encontre.

Saludos
  #3 (permalink)  
Antiguo 06/06/2006, 05:36
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años, 8 meses
Puntos: 9
Vale si fue error de copy paste jeje. Lo demás lo revisaré, creo que tienes razón. Muchas gracias.
  #4 (permalink)  
Antiguo 06/06/2006, 14:55
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 8 meses
Puntos: 17
El error gordo es este:

Código:
if((antpt=fopen("registro_ant.txt","r"))=NULL)
Ese = en vez de ==, te hace que te quedes siempre con

Código:
antpt=NULL
  #5 (permalink)  
Antiguo 06/06/2006, 16:36
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 8 meses
Puntos: 2
Exacto, tienes razon MaxExtreme, esos errores son tan dificiles de detectar en por eso que se recomienda usar las constantes a la izquierda.

if(NULL == (antpt=fopen("registro_ant.txt","r")))

de esta forma si en lugar de usar == usas = el compilador te marcara error al intentar modificar una constante.

en casos de NULL o 0 yo prefiero utilizar !.

Saludos.
  #6 (permalink)  
Antiguo 07/06/2006, 03:06
Avatar de yournightmare86  
Fecha de Ingreso: abril-2006
Ubicación: Madrid
Mensajes: 875
Antigüedad: 18 años, 8 meses
Puntos: 9
Muchas gracias por su ayuda. Tendré en cuenta lo de usar las constantes a la izquierda. :D
  #7 (permalink)  
Antiguo 07/06/2006, 19:09
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 22 años, 1 mes
Puntos: 52
Cita:
Exacto, tienes razon MaxExtreme, esos errores son tan dificiles de detectar en por eso que se recomienda usar las constantes a la izquierda.
Definitivamente, una excelente idea para evitar ese tipo de errores.

Saludos
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 17:55.