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

Error con elemento de matriz

Estas en el tema de Error con elemento de matriz en el foro de C/C++ en Foros del Web. Tengo un problmea con mi codigo resulta que lo que hace es leer las columnas de un archivo y los datos los guarda en una ...
  #1 (permalink)  
Antiguo 22/08/2008, 23:12
 
Fecha de Ingreso: enero-2008
Mensajes: 52
Antigüedad: 16 años, 3 meses
Puntos: 0
Error con elemento de matriz

Tengo un problmea con mi codigo resulta que lo que hace es leer las columnas de un archivo y los datos los guarda en una matriz la cosa es que cuando quiero leer esos elementos de matriz siempre valen 0 y no se porque....

cuando imprimo la matriz entera todo va bien pero si quiero imprimir un elemento puntual me sale 0.000 que es lo que esta mal?

Código:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main (){
 FILE *dato;
 dato=fopen("archi","r");
 char linea[100];
 float m[100][3];
 int i;

for (i=0;i<=100;i++){

 while(fgets(linea,100,dato)!=NULL)
    {
     fscanf(dato,"%f %f %f",&m[i][0],&m[i][1],&m[i][2]);


     printf("%f %f %f %f\n",m[i][0],m[i][1],m[i][2]); //cuando imprimo esto todo sale bien


    }

                                 }
     // si hago esto me aparece 0.000
     // printf("%f \n",m[10][1]);

  fclose(dato);                        
                   
}
  #2 (permalink)  
Antiguo 23/08/2008, 04:56
Avatar de Mort20  
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Error con elemento de matriz

Estás seguro de que el fichero tiene tantos números como los que lees, y que todos ellos no son 0??
La verdad es que yo el C no se como va, pero el C++ lo que guarda en una variable por defecto son valores distintos de 0, valores que usa el programa para sus cosas, como por ejemplo "1920420124". Si en C va igual, entonces es que en tu fichero hay 0. O que el fscanf trata el no existir datos como un 0 y entonces eso es lo que te pone.

Fijate que valores que seguros que hay algo (sea lo que sea) es precisamente los 3 consecutivos que escribes en cada iteración porque son los mismos que has leído. Y los que dices que te funcionan, lógicamente.
__________________
Un Lannister siempre cumple sus promesas
  #3 (permalink)  
Antiguo 23/08/2008, 05:03
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 5 meses
Puntos: 24
Respuesta: Error con elemento de matriz

Como ya has pasado los datos del fichero al buffer "linea", en lugar de usar fscanf() debes usar sscanf().
Además te recomiendo que mientras lo pruebas, imprimas el valor del buffer "linea" antes de llamar a sscanf(), para verificar que tiene lo que quieres.
Por otro lado, tambien es aconsejable acostrumbrarse a comprobar los errores de las funciones. En tu caso estás suponiendo que el fopen() ha ido bien, y puede no ser así.
__________________
Grupos de Música
Pop Music Stars
  #4 (permalink)  
Antiguo 23/08/2008, 08:42
 
Fecha de Ingreso: enero-2008
Mensajes: 52
Antigüedad: 16 años, 3 meses
Puntos: 0
Respuesta: Error con elemento de matriz

a ver ..si estoy seguro que el archivo no tiene 0 porque yo cree uno especialmente par esto con 3 columnas y en cada una de ellas numeros enteros onda:

1 56 1000
2 57 999
3 58 998
4 .... ....
... ... ....

hasta 100 filas

ahora eso del sscanf() lo probare pero.. elcuent oes que porque cuando muestro la matriz así


Código:
   for(i=0; i<=100;i++){

  printf("%f %f %f %f\n",m[i][0],m[i][1],m[i][2]);

                                  }


Funciona perfecto sim embargo si yo quero ver solo un elemento cualquiera me salen puros ceros???? incluso si yo hago esto


Código:
   for(i=0; i<=100;i++){

  printf("%f %f %f %f %f\n",m[i][0],m[i][1],m[i][2],m[1][1]);

                                  }
lo que veo en la pantalla es


1 56 1000 0.00
2 57 999 0.00
3 58 998 0.00
4 .... .... ..
... ... .... ...

de verdad que no se que estoy haciendo mal =(((((
  #5 (permalink)  
Antiguo 23/08/2008, 15:05
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Error con elemento de matriz

El problema es que estás usando un while dentro de un for para recorrer el archivo y la lista, el for recorre la lista y el while el archivo, pero tienes que recorrer los dos a la vez no por separado, porque cuando entras al for i es igual a 0 entonces entras al while ( i sigue siendo 0 ) y recorres todo el archivo guardando los datos leídos en m[i][0], m[i][1] y m[i][2] pero como ya dije i es 0, cuando has terminado de leer el archivo sales del while, regresas al for y aumentas i en 1 y vuelves a leer el archivo, pero como ya se ha leído antes el archivo éste ya está en el final así que la instrucción fgets(linea,100,dato) siempre retorna NULL para todo i mayor que 0.

La explicación me ha quedado algo enredada, por lo que te pongo el código con las correcciones:

Código:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (){
 FILE *dato;
 dato=fopen("archi","r");
 char linea[100];
 float m[100][3];
 int i;

for (i=0;i<=100;i++){

// El while no es correcto en este caso
// while(fgets(linea,100,dato)!=NULL)
//    {

// Cambio el while por un if para detener el for cuando llegue al final del archivo
     if(fgets(linea,100,dato)==NULL) break;

// Cambio el fscanf por sscanf como dijo aloqui
     sscanf(linea,"%f %f %f",&m[i][0],&m[i][1],&m[i][2]);

// Había un %f de más
     printf("%f %f %f\n",m[i][0],m[i][1],m[i][2]); //cuando imprimo esto todo sale bien


//    }

                                 }
     // si hago esto me aparece 0.000
     // printf("%f \n",m[10][1]);

  fclose(dato);                        
                   
}
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 14:58.