AYUDA lectura de fiche en c

Iniciado por J.cE, 11 Mayo 2014, 07:27 AM

0 Miembros y 1 Visitante están viendo este tema.

J.cE

como estan amigos
estoy aprendiendo c y
quisera pedirles ayuda con este codigo por favor
se ve largo pero esta facil
lee un fichero llamado "destinos.dat"
y muestra en pantalla lo que esta en ese fichero
el problema es que no lo esta leyendo correctamente
y al final pide que ingreses un numero entre 1 y 5
cuando lo ingresas se genera una violacion de segmento
espero me puedan ayudar con eso, ya le estuve dando vueltas todo el dia al problema


#include <stdio.h>
/*ESTRUCTURAS-------------------------------------------------------------------*/
typedef struct
{
int cantidad_dias;
int divisas;
}n_dias;

typedef struct
{
int codigo;
n_dias dia[2];
int tamano;
}destinos;
/*PROTOTIPO DE FUNCION----------------------------------------------------------*/
int codigo_destino(destinos r_des[]);
/*ALGORITMO PRINCIPAL-----------------------------------------------------------*/
int main()
{
destinos destino[4];
int seleccion;
seleccion = codigo_destino(destino);
printf("%d seleccion",seleccion);
return 0;
}
/*FUNCION CODIGO_DESTINO--------------------------------------------------------*/
int codigo_destino(destinos r_des[])
{
FILE *destinos;
int i, k, c;
char paises[300];

destinos = fopen("destinos.dat","r");
if(destinos == NULL)
puts("ERROR al abrir el archivo destinos.dat");
else
{
puts("\nseleccione un codigo de destino de la lista");
puts("---------------------------------------------");
k=0;
while(!feof(destinos) && k<5)
{
fscanf(destinos,"%d\n", &r_des[k].codigo);
printf("\nCodigo %d \n", r_des[k].codigo);
puts("-------------------------------------------------");
fscanf(destinos,"%[a-zA-Z, ]\n", paises);
puts(paises);
for(i=0; i<3; i++)
{
fscanf(destinos,"%d %d\n", &r_des[k].dia[i].cantidad_dias, &r_des[k].dia[i].divisas);
r_des[k].tamano = i+1;
printf("Dias del viaje: %d\tcantidad de divisas: %d\n", r_des[k].dia[i].cantidad_dias, r_des[k].dia[i].divisas);
}
puts("-------------------------------------------------");
k++;
}
fclose(destinos);
do
{
puts("\n* ingrese codigo de destino");
scanf("%d",&c);
if(c < 1 || c > 5)
puts("\tel codigo de destino tiene que estar en el rango 1-5");
}
while(c < 1 || c > 5);
}
return(c);
}


esto es lo que contiene el fichero original

Citar
1
Europa, Africa, Oceania
3   2000
7   2000
8   3000
2
Mexico, Estados Unidos, Canada, Belice, Costa Rica, El Salvador, Guatemala, Argentina, Brasil, Chile, Paraguay, Peru, Uruguay, Guyana, Suriname, Antigua, Barbuda, Bolivia, Cuba, Ecuador, Honduras, San Vicente y las Granadinas, Nicaragua
3   1000
7   2000
8   2500
3
Panama
3   500
7   700
8   1000
4
Colombia
3   300
7   500
8   700
5
Otras islas del caribe
3   500
7   700
8   1000

y esto es lo que muestra el programa

Citar

seleccione un codigo de destino de la lista
---------------------------------------------

Codigo 1
-------------------------------------------------
Europa, Africa, Oceania
Dias del viaje: 3       cantidad de divisas: 2000
Dias del viaje: 7       cantidad de divisas: 2000
Dias del viaje: 8       cantidad de divisas: 3000
-------------------------------------------------

Codigo 2
-------------------------------------------------
Mexico, Estados Unidos, Canada, Belice, Costa Rica, El Salvador, Guatemala, Arge
ntina, Brasil, Chile, Paraguay, Peru, Uruguay, Guyana, Suriname, Antigua, Barbud
a, Bolivia, Cuba, Ecuador, Honduras, San Vicente y las Granadinas, Nicaragua
Dias del viaje: 3       cantidad de divisas: 1000
Dias del viaje: 7       cantidad de divisas: 2000
Dias del viaje: 3       cantidad de divisas: 2500
-------------------------------------------------

Codigo 3
-------------------------------------------------
Panama
Dias del viaje: 3       cantidad de divisas: 500
Dias del viaje: 7       cantidad de divisas: 700
Dias del viaje: 3       cantidad de divisas: 1000
-------------------------------------------------

Codigo 4
-------------------------------------------------
Colombia
Dias del viaje: 3       cantidad de divisas: 300
Dias del viaje: 7       cantidad de divisas: 500
Dias del viaje: 3       cantidad de divisas: 700
-------------------------------------------------

Codigo 5
-------------------------------------------------
Otras islas del caribe
Dias del viaje: 3       cantidad de divisas: 500
Dias del viaje: 7       cantidad de divisas: 700
Dias del viaje: 3       cantidad de divisas: 1000
-------------------------------------------------

* ingrese codigo de destino
1
1 seleccion
(aqui el programa deja de responder)
Process exited with return value 3221225477
Press any key to continue . . .

rir3760

El error que mencionas se debe a que el numero de elementos de los arrays están mal:
n_dias dia[2];

/* ... */

destinos destino[4];


Hay que cambiar esas dos lineas a:
n_dias dia[3];

/* ... */

destinos destino[5];


Un saludo
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

J.cE

mil gracias amigo por tu ayuda
de verdad era eso
pero ahora tengo una duda
porque tiene que ser en lugar de 2 - 3 si las repeticiones para el i son <3
y en lugar de 4 - 5 si las repeticiones para el k son <5 ?

rir3760

Porque en C los indices validos van de 0 a N-1 con N igual al numero de elementos. Si tu declaras un array:
int a[10];
Este tiene 10 elementos y se accede a ellos con a[0], a[1], ... a[9].

Un saludo
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