Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: muymuyperdido en 25 Diciembre 2012, 20:43 pm



Título: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: muymuyperdido en 25 Diciembre 2012, 20:43 pm
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)

Código
  1. void fic1tabla (char dat1[N],float tab1[N][N])
  2. {
  3.    int m,i,j;
  4. FILE * ft;
  5.    ft= fopen(dat1[N],"r");
  6.    if(ft==NULL)
  7.    {
  8.        printf("ERROR");
  9.    }
  10.    else
  11.    {
  12.        fscanf(ft,"%d",&m);
  13.        while(!feof(ft))
  14.        {
  15.            for(i=0; i<N; i++)
  16.            {
  17.                for(j=0; j<m; j++)
  18.                {
  19.                    fscanf(ft,"%f",tab1[i][j]);
  20.                }
  21.            }
  22.            fclose(ft);
  23.        }
  24.  
  25.    }
  26.  
  27. }


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: durasno en 26 Diciembre 2012, 05:52 am
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:
Código
  1. fscanf(ft,"%f",&tab1[i][j]);


Saludos

PD: trata de escribir los errores q te marca el compilador


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: muymuyperdido en 26 Diciembre 2012, 15:36 pm
Entonces como seria el codigo para volcar un archivo en una tabla? :|


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: rir3760 en 26 Diciembre 2012, 18:19 pm
* 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:
Código
  1. if ((ft = fopen(dat1, "r")) == NULL){
  2.   perror(dat1);
  3.   /* Manejo de error */
  4. }
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:
Código
  1. /* Con el operador "direccion de" */
  2. fscanf(ft, "%f", &tab1[i][j]);
  3.  
  4. /* Con aritmetica de punteros */
  5. fscanf(ft, "%f", tab1[i] + j);

Entonces 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


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: muymuyperdido en 27 Diciembre 2012, 22:19 pm
El problema es que yo conozco el numero de columnas pero no el de filas, entonces no sé como plantearlo.


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: durasno en 28 Diciembre 2012, 08:00 am
Nose si leiste lo que te dije del retorno de fscanf, pero en fin mas o menos seria asi:

Código
  1. while(fscanf(fp,"%d",&matriz[i][j])==1) {
  2.   if(j++==(columnas-1)){
  3.     i++;
  4.     j=0;
  5.   }
  6. }
  7. filas=i;

Creo q deberia andar. Saludos


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: muymuyperdido en 28 Diciembre 2012, 12:47 pm
Gracias! Acabé planteandolo similar:

Código
  1. fscanf(fe,"%d",&m);
  2.    i=1;
  3.    j=1;
  4.    while(!feof(fe))
  5.    {
  6.        fscanf(fe,"%d",&m);
  7.        while(!feof(fe))
  8.        {
  9.            fscanf(fe,"%f", &tab2[i][j]);
  10.            j++;
  11.            if (j==m)
  12.            {
  13.                j=1;
  14.                i++;
  15.            }
Pero aun no sé si funciona, sino me valdré del tuyo, gracias en serio!!!!


Título: Re: Meter en una tabla datos desde un fichero (en funcion)
Publicado por: rir3760 en 29 Diciembre 2012, 02:21 am
Gracias! 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:
Código
  1. i = 0;
  2. j = 0;
  3. if (fscanf(fe, "%d", &m) == 1)
  4.   while (fscanf(fe, "%f", tab2[i] + j) == 1)
  5.      if (++j == m){
  6.         j = 0;
  7.         i++;
  8.      }

Un saludo