Meter en una tabla datos desde un fichero (en funcion)

Iniciado por muymuyperdido, 25 Diciembre 2012, 20:43 PM

0 Miembros y 1 Visitante están viendo este tema.

muymuyperdido

Buenas, mi problema está en introducir los datos de un fichero en una tabla
El fichero es del estilo
3
1 2 3
4 5 6
7 8 9
De forma que el 3 es el numero de columnas, que es lo primero que leemos y después he de leer los elementos 1 2 3 4 5 6 7 8 9 introduciendolos en una matriz de 3x3 (el programa no sabe cuantas filas hay)

(Está hecho en una función)

void fic1tabla (char dat1[N],float tab1[N][N])
{
   int m,i,j;
FILE * ft;
   ft= fopen(dat1[N],"r");
   if(ft==NULL)
   {
       printf("ERROR");
   }
   else
   {
       fscanf(ft,"%d",&m);
       while(!feof(ft))
       {
           for(i=0; i<N; i++)
           {
               for(j=0; j<m; j++)
               {
                   fscanf(ft,"%f",tab1[i][j]);
               }
           }
           fclose(ft);
       }

   }

}

durasno

Hola! en el fopen debes pasar dat1 y no dat1[N]. El bucle while me parece que esta demas; si usas i<N siempre va a iterar N veces(lo cual esta mal)... Lo que podes hacer es usar el retorno de fscanf: http://c.conclase.net/librerias/?ansifun=fscanf
De esa manera podes utilizar como corte de los for el retorno de fscanf

Otra cosa te falto un "&" delante de tab1:
fscanf(ft,"%f",&tab1[i][j]);


Saludos

PD: trata de escribir los errores q te marca el compilador
Ahorrate una pregunta, lee el man

muymuyperdido

Entonces como seria el codigo para volcar un archivo en una tabla? :|

rir3760

* Si la apertura del archivo falla no generes el mensaje de error manualmente, deja que la función perror se encargue de ello. Por ejemplo:
if ((ft = fopen(dat1, "r")) == NULL){
   perror(dat1);
   /* Manejo de error */
}

Por cierto dales nombres descriptivos a las variables, en lugar de "ft" puedes utilizar, por ejemplo, "nom_archivo".

* Debes verificar que el numero de columnas y filas leído del archivo (primer valor) sea igual o menor que la capacidad del array. Eso lo haces con una sentencia condicional "if".

* No utilices la función feof para controlar un bucle, en su lugar utilizas dos bucles para leer cada uno de los valores de la matriz. El limite en ambos bucles debe ser "m".

* Como ya te comentaron debes utilizar el operador "dirección de" (el '&') en la llamada a función o bien aritmética de punteros:
/* Con el operador "direccion de" */
fscanf(ft, "%f", &tab1[i][j]);

/* Con aritmetica de punteros */
fscanf(ft, "%f", tab1[i] + j);


Cita de: muymuyperdido en 26 Diciembre 2012, 15:36 PMEntonces como seria el codigo para volcar un archivo en una tabla?
Si juntas todo lo dicho en el tema mas un poco de iniciativa lo resuelves en poco tiempo.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

muymuyperdido

El problema es que yo conozco el numero de columnas pero no el de filas, entonces no sé como plantearlo.

durasno

Nose si leiste lo que te dije del retorno de fscanf, pero en fin mas o menos seria asi:

while(fscanf(fp,"%d",&matriz[i][j])==1) {
   if(j++==(columnas-1)){
     i++;
     j=0;
   }
}
filas=i;


Creo q deberia andar. Saludos
Ahorrate una pregunta, lee el man

muymuyperdido

Gracias! Acabé planteandolo similar:

fscanf(fe,"%d",&m);
    i=1;
    j=1;
    while(!feof(fe))
    {
        fscanf(fe,"%d",&m);
        while(!feof(fe))
        {
            fscanf(fe,"%f", &tab2[i][j]);
            j++;
            if (j==m)
            {
                j=1;
                i++;
            }

Pero aun no sé si funciona, sino me valdré del tuyo, gracias en serio!!!!

rir3760

Cita de: muymuyperdido en 28 Diciembre 2012, 12:47 PMGracias! Acabé planteandolo similar [...]

Pero aun no sé si funciona
No funciona por varios errores como leer dos veces el numero de columnas, utilizar feof para controlar los bucles y utilizar 1 como primer indice de un array.

Una forma correcta es:
i = 0;
j = 0;
if (fscanf(fe, "%d", &m) == 1)
   while (fscanf(fe, "%f", tab2[i] + j) == 1)
      if (++j == m){
         j = 0;
         i++;
      }


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language