Enviar un archivo a una funcion "leer matriz" en c

Iniciado por Idmus, 11 Noviembre 2013, 16:31 PM

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

Idmus

Hola, tengo una duda, el el caso de que quisiera leer una matriz dentro de un archivo ".txt" desde una funcion... ¿como seria posible? , es decir tengo mi funcion


"int main()"

y dentro de esta funcion llamo a una funcion que se llama "leer matriz()"

pero nose como enviar ese archivo "matriz.txt" con la matriz a la funcion para que me lo lea desde adentro de la funcion "leermatriz()"


agradeceria una ayuda de antemano muchas gracias


PD: lo que estaria adentro del archivo "matriz.txt"
seria algo asi:



1 3 4  7
2 4 8  8
5 8 10 9

rir3760

Cita de: Idmus en 11 Noviembre 2013, 16:31 PMtengo una duda, el el caso de que quisiera leer una matriz dentro de un archivo ".txt" desde una funcion... ¿como seria posible? , es decir tengo mi funcion

"int main()"

y dentro de esta funcion llamo a una funcion que se llama "leer matriz()"

pero nose como enviar ese archivo "matriz.txt" con la matriz a la funcion para que me lo lea desde adentro de la funcion "leermatriz()"
El escenario mas simple es aquel donde conoces el numero de filas y columnas. En ese caso solo debes pasar a la función el nombre del archivo y la dirección base del array. Dentro de la función abres el archivo, lo procesas y finalmente lo cierras.

Mas o menos así:
#include <stdio.h>
#include <stdlib.h>

#define NUM_FILAS  3
#define NUM_COLS   4

int leer_matriz(char const *nom_entrada, int mat[][NUM_COLS]);

int main(void)
{
   int mat[NUM_FILAS][NUM_COLS];
   char const *nombre = "Entrada.txt";
   
   /* ... */
   
   leer_matriz(nombre, mat);
   
   /* ... */
   
   return EXIT_SUCCESS;
}

int leer_matriz(char const *nom_entrada, int mat[][NUM_COLS])
{
   FILE *entrada;
   int rv;
   
   if ((entrada = fopen(nom_entrada, "rt")) == NULL){
      /* Manejo de error */
   }else {
      /* Procesar el contenido del archivo */
   }
   fclose(entrada);
   
   return rv;
}


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

Idmus

Muchas gracias, aunque el problema esta en que no puedo hacer uso de variables globales. ademas debe calcular la matriz (sist.de ecuaciones) por el metodo de gauss jordan)

Idmus

#include <stdio.h>
#include <stdlib.h>


void LlenarMatriz (float s[50][50], int *t)
{
     int i, j, c;
     char a[20];
     
     FILE *arch;
     gets(a);
     arch = fopen("matriz.txt","r");
     fscanf (arch, "%i", c);
      *t=c;
     
     while (!feof(arch))
     
   
     
     for (i=0; i<c; i++)
         for (j=0; j<c; j++)
             fscanf (arch, "%f", &s[j]);
     
     fclose (arch);
}

void EscribirMatriz (float s[50][50], int t)
{
     int i, j, c;
     t=c;
     
     for (i=0; i<c; i++)
         for (j=0; j<c; j++)
             printf ("%d", s[j]);
}


void GaussJordan (float s[50][50], int t)
{
     float piv, x, y;
     int i, ii, j, m;
         for (i=0; i<t; i++)
         {
             for (ii=0; ii<t; ii++)
             {
                 if (ii != i)
                 {
                        x = -s[ii];
                        y = s[ii];
                        for (j=0; j<t+1; j++)
                            s[ii][j] = -s[ii][j]/y*x+s[j];
                 }
             }
         }
}


int main()
{
    int n;
    float a[50][50];
   
    printf("Trabajo realizado por los Alumnos por miMIKASA EREN \n\n");
    printf("Ingrese el tamaño de la Matriz: \n");
    scanf ("%d", &n);
         
    LlenarMatriz(a,&n);
    EscribirMatriz(a,n);
    GaussJordan(a,n);
    EscribirMatriz(a,n);
   
    return 0;
}




el codigo compila , pero se cierra cuando ingreso el tamaño de la matriz, por ejemplo, colo que la matriz tendra un tamaño 3, pero se cierra la consola luego de eso... quisiera saber cual es el problema

rir3760

Cuando publiques código fuente por favor utiliza las etiquetas de código. Estas se agregan mediante el cuadro desplegable con el texto "GeSHi" en la pagina de composición de mensajes, solo tienes que seleccionar ahí el lenguaje (C, C++, etc.).

----

En el programa no tiene caso pedir el numero de filas y columnas en la función main porque ese valor se ignora (lo primero que haces en la función "LlenarMatriz" es destruir ese valor sobrescribiendolo con otro).

El error se encuentra en esa función (me refiero a "LlenarMatriz"), cuando lees el numero de filas con esta linea:
fscanf(arch, "%i", c);
Falta utilizar el operador "dirección de" (el '&'), debería ser:
fscanf(arch, "%i", &c);

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

Idmus

#include <stdio.h>
#include <stdlib.h>


FILE *Leer(){
FILE *superfacil;
superfacil=fopen("datos.txt", "r" );
return (superfacil);


int TotalLines(){
FILE *arch;
arch=fopen("datos.txt","r");
   int ch,num_lineas = 0;
   while ((ch = fgetc(arch)) != EOF)
      if (ch == '\n')
         num_lineas++;
    return(num_lineas+1);
}

int main() {
int a[10][10],b[10],n,i,j,k,l;
float t;

FILE *azucar;
azucar=Leer();
n=TotalLines();

for(i=0;i<n;i++){
for(j=0;j<n;j++){
fscanf(azucar,"%d",&a[i][j]);
}
fscanf(azucar,"%d",&b[i]);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%d\t",a[i][j]);

printf("%d\n",b[i]);
}

system("pause");
return 0;

}






de esta forma puedo leer una matriz, sin embargo hallar el codigo de c para solucionarlo por gauss jordan me ha sido complicado, tira errores cuando intento loss que estan ya hecho o cuando intento modificar esos archivos para qu funcionen en mi codigo.... ¡que codigo me servivria para aplicar gauss gordan a la matriz que leo adentro del archivo?