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 originalconst int MAX = 100;
const int NUMCOLUMNAS = 14;
int array[100];
offset = 0*NUMCOLUMNAS + 0;
O si quieres acceder al elemento matriz[2][3] entonces seria de la siguiente manera:
Código C:
Ver originalconst int MAX = 100;
const int NUMCOLUMNAS = 14;
int array[MAX];
offset = 2*NUMCOLUMNAS + 3;
Si quieres leer la "matriz" completa, quedaria algo parecido a:
Código C:
Ver originalconst int MAX = 100;
const int NUMRENGLONES = 16;
const int NUMCOLUMNAS = 14;
int array[MAX];
for(renglon=0;renglon<=NUMRENGLONES;renglon++)
{
for(columna=0;columna<=NUMCOLUMNAS;columna++)
{
offset = renglon*NUMCOLUMNAS + columna;
}
}
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#include <stdio.h>
int main()
{
const int MAX = 100;
const int NUMCOLUMNAS = 4;
const int NUMRENGLONES = 4;
FILE *fp;
int c,i,offset,renglon,columna;
char array[MAX];
fp
= fopen("data.txt","r"); i=0;
offset=0;
while (c!= EOF)
{
i++;
}
for(renglon=0;renglon<=NUMRENGLONES;renglon++)
{
for(columna=0;columna<=NUMCOLUMNAS;columna++)
{
offset = renglon*NUMCOLUMNAS + columna;
}
}
return 0;
}
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.