Ver Mensaje Individual
  #23 (permalink)  
Antiguo 18/12/2010, 03:50
nitsuga1986
 
Fecha de Ingreso: octubre-2008
Mensajes: 91
Antigüedad: 15 años, 6 meses
Puntos: 0
Respuesta: leer una matriz desde fichero en C

Cita:
Iniciado por AlanChavez Ver Mensaje
No te lo compliques demasiado, utiliza asignacion dinamica de memoria, con el concepto de row major order.

Row major order, es como el compilador guarda las matrices en memoria. Veras, la memoria es secuencial, por lo que la computadora no es capaz de ver una matriz como matriz, sino como un arreglo lineal.

Los lenguajes de programacion tienen diferentes formas de lidiar con esto, y la que usa C/C++ es el row major order.
Eso quiere decir, que el compilador, toma los arrays, renglon por renglon y los guarda secuencialmente en la memoria.

La formula del row major order es la siguiente:

offset = renglon*NUMCOLUMNAS + columna

donde offset es el indice en un array unidimensional, en donde se encuentra el valor que quieres accesar.
renglon, es el renglon en donde se encuentra el elemento.
columna, es la columna donde se encuentra el elemento
NUMCOLUMNAS, es el numero TOTAL de columnas que tiene tu matriz.


Por ejemplo si quieres acceder al elemento de la matriz [0][0];
el equivalente en row major order seria.

Código C:
Ver original
  1. const int MAX = 100;
  2. const int NUMCOLUMNAS = 14;
  3.  
  4. int array[100];
  5. offset = 0*NUMCOLUMNAS + 0;
  6. printf("%d",array[offset]);;

O si quieres acceder al elemento matriz[2][3] entonces seria de la siguiente manera:
Código C:
Ver original
  1. const int MAX = 100;
  2. const int NUMCOLUMNAS = 14;
  3.  
  4. int array[MAX];
  5. offset = 2*NUMCOLUMNAS + 3;
  6. printf("%d",array[offset]);;

Si quieres leer la "matriz" completa, quedaria algo parecido a:

Código C:
Ver original
  1. const int MAX = 100;
  2. const int NUMRENGLONES = 16;
  3. const int NUMCOLUMNAS = 14;
  4.  
  5. int array[MAX];
  6. for(renglon=0;renglon<=NUMRENGLONES;renglon++)
  7. {
  8.  for(columna=0;columna<=NUMCOLUMNAS;columna++)
  9.   {
  10.     offset = renglon*NUMCOLUMNAS + columna;
  11.     printf("%d",array[offset]);
  12.    }
  13.   printf("\n");
  14. }


Finalmente, este codigo debe solucionar tu problema, solo cambia los parametros y si no quieres utilizar una constante MAX = 100, utiliza asignacion dinamica.
Utilizando el concepto de row major order, tambien puedes tener una matriz dinamica, desde mi punto de vista, es mas facil de implementar que un array de punteros ;)


Código C:
Ver original
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     const int MAX = 100;
  5.     const int NUMCOLUMNAS = 4;
  6.     const int NUMRENGLONES = 4;
  7.  
  8.    FILE *fp;
  9.    int c,i,offset,renglon,columna;
  10.    char array[MAX];
  11.    fp = fopen("data.txt","r");
  12.    i=0;
  13.    offset=0;
  14.    while (c!= EOF)
  15.    {
  16.        c = fgetc(fp);
  17.        array[i] = putchar(c);
  18.        i++;
  19.    }
  20.    printf("\n\n\n");
  21.    fclose(fp);
  22.    for(renglon=0;renglon<=NUMRENGLONES;renglon++)
  23.    {
  24.        for(columna=0;columna<=NUMCOLUMNAS;columna++)
  25.        {
  26.            offset = renglon*NUMCOLUMNAS + columna;
  27.            printf("%c",array[offset]);
  28.        }
  29.        printf("\n");
  30.    }
  31.    return 0;
  32. }


Por otra parte, tienes razon, hay algunas cosas que en C requieren cientos de lineas de codigo, cuando en otros lenguajes se pueden implementar facilmente. Es por eso que se tiene que tener bien claro cual es el proposito final de la aplicacion, para poder encontrar un lenguaje de programacion que nos facilite la implementacion de la solucion.
gracias por todo, pero ni con esas, me da en todas las lineas el siguiente fallo:

error: stray ‘\240’ in program


error: stray ‘\302’ in program

en cuanto a como lo imprimo....
Código C:
Ver original
  1. for (int i=0;i<17;i++)
  2.   for(int j=0;j<19;j++)
  3.     printf("%i",escenario[i][j]);