/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

archivo en c

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
ups!!



Registrado: 02 Sep 2007
Mensajes: 13

MensajePublicado: 04/10/2007 9:50 pm
Título: archivo en c

tengo que construir un programa que genere las predicciones para los doce signos zodiacales y tengo el siguiente codigo:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define P 300
#define Q 50
#define A 200


main(){

FILE *f_in,*oar,*m,*f_out;
char color[P], prediccion[P], signo[P];
int cont[A], cont1[Q];
int i, ran, aux, j, y, num;

time_t tiempo;
time(&tiempo);
srand(tiempo);

for(i=0; i<A; i++){
cont[i]=i;
y=i;
}
for(i=0; i<Q; i++){
cont1[i]=i;
j=i;
}

f_in=fopen("signos.txt", "r");
f_out=fopen("horoscopo.txt", "w");

while(fgets(signo,P,f_in)!='\0'){
fputs(signo,f_out);


m=fopen("predicciones.txt", "r");
ran=rand()%y;
aux=cont[ran];
cont[ran]=cont[y];

y--;
i=0;

while(fgets(prediccion,P,m)!=NULL){ //a esta sentencia no entra
if(i==cont)
fputs(prediccion,f_out);

i++;
}
fclose(m);

oar=fopen("color.txt", "r");
ran=rand()%j;
aux=cont[ran];
cont[ran]=cont[j];
j--;
i=0;
while(fgets(color,P,oar)!=NULL){// a esta sentencia no entra
if(i==aux){
fputs(oar,f_out);
i++;
}

}

fclose(oar);

num=rand()%100+1;
fprintf(f_out,"Numero %d\n", num);

fputs("\n", f_out);

}

fclose(f_out);
system("pause");
}


pero no se que pasa que no me entra a dos de los while, lo que provoca que no imprima los colores y las predicciones.
me podrian ayudar
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3841
Ubicación: Mexico

MensajePublicado: 05/10/2007 7:59 am
Título:

En el programa no es necesario declarar una variable de tipo time_t solo para pasarla a la funcion srand:
Código:
time_t tiempo;
time(&tiempo);
srand(tiempo);

En su lugar es mejor utilizar directamente el valor de retorno de la funcion time utilizando NULL como argumento:
Código:
srand((unsigned) time(NULL))



En estos dos bucles las asignaciones a las variables "y" y "j" en cada iteracion:
Código:
for (i = 0; i < A; i++) {
   cont[i] = i;
   y = i;
}
for (i = 0; i < Q; i++) {
   cont1[i] = i;
   j = i;
}

Son innecesarias ya que su valor final se puede calcular antes de la ejecucion de los bucles, para el caso es mejor:
Código:
for (i = 0; i < A; i++)
   cont[i] = i;
y = i - 1; /* O tambien "y = A - 1" */

for (i = 0; i < Q; i++)
   cont1[i] = i;
j = i - 1; /* O tambien "j = Q - 1" */



Por cierto el objetivo principal de las constantes simbolicas:
Código:
#define P 300
#define Q 50
#define A 200

Es el uso de nombres claros y descriptivos, si vas a utilizar nombres como x, y, z (o incluso FOO, BAR, FOOZLE) mejor utiliza los valores directamente.

El archivo de entrada lo abres pero no lo cierras mediante fclose.

El primer error importante no es el bucle while sino la condicion en el if:
Código:
if (i == cont)

La variable "i" es de tipo "int" meintras que "cont" es un array de enteros (o "int []").

El segundo error importante se encuentra inmediatamente, en la llamada a fputs:
Código:
fputs(oar, f_out);

Aqui tanto "oar" (bonito nombre) como "f_out" son variables de tipo "FILE *" lo que no es correcto ya que fputs espera dos argumentos, el primero de tipo "const char *" y el segundo de tipo "FILE *".


Por ultimo te recomendaria publicar el codigo fuente de tus programas utilizando la etiqueta "code" y tambien trata de darle a las constantes y variables de tus programas nombres tan claros y descriptivos como sea posible.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com