Hola amigos de Elhacker.net quisiera su ayuda esta vez con el almacenamiento de caracteres y flotantes en el "for" donde tengo que almacenar varios datos : nombre y codigos .Por ejemplo:
paloer 234234.56323 2342.563
loerto 454353.4564 23423.6722
setra 43534.56754 7864.6573
#include<stdio.h>
#define MAX 13
int main(){
int i,j,k,n;
double p[MAX][1];
char nombre[MAX];
FILE *txt;
printf("Numero de datos:\n");
scanf("%d",&n);
txt=fopen("Lista_datos.txt","r");
if(!txt)
printf("Error no existe archivo\n");
else{
for(i=0;i<n;i++)
fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);// Obviamente acá el uso de la lectura de los caracteres está mal usado, aquí es donde quisiera su ayuda
for(i=0;i<n;i++)
printf("%s %lf %lf",nombre[i],p[i][0],p[i][1]);
}
fclose(txt);
return 0;}
Quisiera como utilizar o hay un comando especial como poder trabajar con estos caracteres que varian para poder trabajar con estos datos .. agradecería bastante ayuda . Saludos!!!
double p[MAX][1];
Esta declaración no tiene demasiado sentido. Si pretendes almacenar dos números en cada posición de "p" tienes que declarar la variable así:
double p[MAX][2];
De esta forma, para cada p dispones de dos espacios, uno para cada numero.
Ahora vamos con las cadenas:
char nombre[MAX];
Esta declaración está mal. Las cadenas de caracteres no se usan exactamente igual que el resto de "tipos nativos". Me explico:
Si intentas almacenar "hola" en C necesitas (al menos) 5 bytes de memoria... si en cambio intentas almacenar "mensaje", la cantidad de memoria requerida asciende a 8 bytes. En cambio, en un int todos los números van a ocupar 4 bytes... ya estés almacenando el 0 o el 5.234.045.
Dicho esto, cada cadena de caracteres es, como su propio nombre indica, una secuencia de tipo "char". Esto quiere decir que "char nombre[MAX]" únicamente te va a permitir almacenar una cadena de caracteres... cuya longitud máxima será MAX-1. Si tu idea es poder almacenar MAX cadenas de caracteres diferentes la declaración debería quedar así:
char nombre[MAX][20];
Esto suponiendo que cada "nombre" no vaya a ocupar más de 19 caracteres.
Si miramos ahora el bucle for, tenemos:
for(i=0;i<n;i++)
fscanf(txt,"%s %lf %lf",&nombre[MAX],&p[i][0],&p[i][1]);
Esto, como bien has indicado, está mal. Aplicando los cambios que hemos comentado anteriormente, este bucle debería lucir más o menos así:
for(i=0;i<n;i++)
fscanf(txt,"%s %lf %lf",&nombre[i],&p[i][0],&p[i][1]);
Fíjate que ha desaparecido toda referencia a "MAX", lo cual tiene sentido, ya que intentamos guardar cada nombre en una posición diferente.
Consejos finales:
* Deberías validar que "n" se encuentra dentro del rango [1..13], ya que si te da por poner una cantidad superior vas a escribir en memoria que no te pertenece y eso te va a dar problemas.
* Deberías poner a las variables nombres con significado propio, "p" o "n" no dicen absolutamente nada y eso dificulta la lectura del código.
* Deberías tabular el código con criterio, mejoras la legibilidad del código.
Un saludo.