Foros del Web » Programación para mayores de 30 ;) » C/C++ »

leer fichero y guardarlo en matriz (2)

Estas en el tema de leer fichero y guardarlo en matriz (2) en el foro de C/C++ en Foros del Web. Hola de nuevo :) Resulta que tengo un codigo en el que leo un fichero y lo imprimo, la cuestion es que quiero meter el ...
  #1 (permalink)  
Antiguo 26/05/2014, 11:46
Avatar de Totti7  
Fecha de Ingreso: mayo-2012
Ubicación: barcelona
Mensajes: 28
Antigüedad: 12 años, 7 meses
Puntos: 2
leer fichero y guardarlo en matriz (2)

Hola de nuevo :)
Resulta que tengo un codigo en el que leo un fichero y lo imprimo, la cuestion es que quiero meter el fichero en un struct. el fichero es este:
227788,000200,(200100, 200101, 200102, 200103, 250104)
227788,000200,(200100, 200101, 200102, 200103, 250104, 300126)
227788,000200,(200100, 200101, 200102, 200103, 250104)
227788,000200,(200100, 200101, 200102, 200103, 250104)

la primera fila matriz seria: (primer numero hasta la coma 227...),(segundo numero),(los numeros que estan en el parentesis..) en total tiene 3 columnas :)

que es lo que e conseguido imprimir con el siguiente código:
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NumAsign 100
  5. #define NumAulas 30
  6. #define NumAlumnos 350
  7. #define NumProfes 50
  8. #define NumAlumnAsign 700
  9.  
  10. struct matricula{
  11.         int nia;
  12.         int grado;
  13.         int lista_asign[NumAsign];
  14.      };
  15.  
  16. void leermatricula(){
  17.        
  18.     int c;    
  19.     FILE *p;
  20.     p = fopen("matricula.txt", "r");
  21.      
  22.         if(p==NULL){
  23.         printf("Error: no se pudo abrir el archivo.\n");
  24.         }
  25.  
  26.         c = fgetc(p);
  27.         while (c!= EOF)
  28.         {
  29.             putchar(c);
  30.             c = getc(p);
  31.  
  32.         }        
  33.         fclose(p);
  34.         getchar();
  35.         ;
  36.     }
  37.  
  38. int main() {
  39.   leermatricula();
  40. }

La cuestion es que quiero, como ya he dicho antes, guardar cada columna en el struct, siendo la primera columna el nia, la segunda el grado y la ultima lista_asign..
Gracias de antemano!:)
  #2 (permalink)  
Antiguo 26/05/2014, 12:40
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 16 años, 6 meses
Puntos: 61
Respuesta: leer fichero y guardarlo en matriz (2)

Si lo resolvieras en C++, este problema podria resolverse sin usar tanto malabarismo.
Re-usando las mismas ideas que en una discusion anterior, puedes:

- reemplazar los parentesis por espacios en blanco, lo mismo con las comas. Con ello te beneficias de no tener que tokenizar y puedes leer todo directamente usando un istringstream (ver discusion anterior). El ultimo parentesis no es necesario reemplazarlo, realmente.

- Una vez que has separado todo con espacios ya puedes hacer llegar los datos a donde quieras, por ejemplo a variables de tipo entero. En tu caso, campos enteros de una struct.

No está completo todo, pero la idea es parecido a esto:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.     string line;
  11.     ifstream f ("archivo.txt");
  12.     if (!f.is_open()) exit(1);
  13.  
  14.     int v1, v2, n;
  15.     while ( getline (f,line) ) {
  16.         cout << "Lei: " << line << '\n';
  17.         replace( line.begin(), line.end(), '(', ' ');
  18.         replace( line.begin(), line.end(), ',', ' ');
  19.         istringstream ss(line);
  20.         ss >> v1 >> v2;
  21.         cout << " v1: " << v1 << " v2: " << v2 << " { ";
  22.         while( ss >> n ) {
  23.             cout << n << " ";
  24.         }
  25.         cout << "}" << endl;
  26.     }
  27.  
  28.     f.close();
  29. }

Supongo que este es el empujón necesario y suficiente para empezar.
__________________
Visita mi perfil en LinkedIn
  #3 (permalink)  
Antiguo 26/05/2014, 12:51
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: leer fichero y guardarlo en matriz (2)

En tu otro post http://www.forosdelweb.com/f96/leer-fichero-c-1100018/ te resolví el ejercicio de leer por lineas y tokenizar los datos, aun asi sigues leyendo caracter por caracter.

Pon un poco de tu parte: prueba por lo menos a leer por lineas y a encontrar un patron que te sirva para serializar la carga de datos. Te comento por encima: ya conoces la funcion strtok, y si has revisado el codigo que te puse en el otro post tambien sabes como funciona esta funcion. Con esto y sabiendo que en las lineas de matricula esperas encontrar un inicio de parentesis, puedes definir un patron tal que: tokenizar por apertura de parentesis, si existe contenido será la parte <nia>,<grado>, tokenizas esta primera parte por comas y obtienes 'nia', y 'grado'; luego te queda la segunda parte <asign_0><asign_1>...<asign_n>), trimas el cierre de parentesis y tokenizas por comas obteniendo la lista de asignaturas. Ya has obtenido todos los datos.

Lo siguiente es crear la lista de structs: si solo estas haciendo un ejercicio puedes definir un array de estructuras de longitud estatica e ir escribiendo; si estas haciendo una aplicacion comercial te convendría adentrarte en la memoria dinamica (reserva, acceso y liberacion), para esto te será util qualquier tutorial de listas enlazadas simples.

Personalmente comenzaria por el serializado de carga (leer linea, tokenizar, y diferenciar datos). Luego ya decidiras como guardas esos datos obtenidos.

En este foro puedes encontrar muchos threads que tratan de los mismo, es cuestion que pierdas unos minutos buscando y revisando los codigos propuestos.

Saludos
vosk
  #4 (permalink)  
Antiguo 26/05/2014, 12:53
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: leer fichero y guardarlo en matriz (2)

@CalgaryCorpus: perdona no vi que ya habias respondido
  #5 (permalink)  
Antiguo 26/05/2014, 13:10
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: leer fichero y guardarlo en matriz (2)

Por cierto que casi se me olvida, en c tambien tienes la funcion sscanf. Ya se que no debería resolver y suponiendo que has seguido mi consejo de cargar por lineas, por lo menos que quede constancia que en C es posible hacerlo sin tantos malabarismos :))

Código C:
Ver original
  1. sscanf(line, "%d,%d,(%200[0-9a-zA-Z ,]s)\n", &nia, &grado, str_asign);
  2. //ya tienes nia y grado
  3.  
  4. //tokenizas str_asign para encontrar numeros de asign
  5. pch = strtok(str_asign, ",");
  6. while(pch) {
  7.     asign = atol(pch);
  8.     //ya tienes asign
  9.  
  10.     pch = strtok(0, ",");
  11. }

Lo siguiente es implementar el array de structs. Suerte con eso.

Saludos
vosk
  #6 (permalink)  
Antiguo 28/05/2014, 01:16
Avatar de Totti7  
Fecha de Ingreso: mayo-2012
Ubicación: barcelona
Mensajes: 28
Antigüedad: 12 años, 7 meses
Puntos: 2
Respuesta: leer fichero y guardarlo en matriz (2)

Muchas gracias a los dos, pero mas o menos con la idea i con los apuntes q tengo he hecho esto (al final entendi lo d linea por linea xD)
Nota: esto lo he hecho con el fscanf tal como tengo en los apuntes, luego probare con tu forma. Pero de esta manera me da un error en la llamada de la funcion en el main, donde pone leermatricula(*matricula)
Porque ? Graciass:D


Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define NumAlumnAsign 700
  5.  
  6.      typedef struct {
  7.         int nia;
  8.         int grado;
  9.         int lista_asign[NumAsign];
  10.      }matricula;
  11.  
  12.  
  13. void leermatricula(matricula *matricula){
  14.        
  15.     FILE *p;
  16.     char *a,line[300];
  17.     int c;
  18.     char *b;
  19.     int i;
  20.  
  21.         if (p= fopen("matricula.txt", "r"))
  22.          {
  23.               if(p==NULL){
  24.                 printf("Error: no se pudo abrir el archivo.\n");
  25.                 exit(1);
  26.                 }
  27.             else {
  28.                 c = fgetc(p);    
  29.                 while(c!= EOF){
  30.                 putchar(c);
  31.                 c = getc(p);
  32.  
  33.                     if((a = fgets(line, sizeof(line), p))) {
  34.                     printf("%s\n", line);
  35.  
  36.                         for (i=1; i<4; i++)
  37.                         {
  38.                             if(i==1)
  39.                             {
  40.                                 if((b = strtok(line, ","))) {
  41.                                 fscanf(p,"%d",matricula[i].nia);
  42.                                 }
  43.                             }
  44.  
  45.                             else if(i==2)
  46.                             {
  47.                                 if((b = strtok(line, ","))) {
  48.                                 fscanf(p,"%d",matricula[i].grado);
  49.                                 }
  50.                             }
  51.  
  52.                             else if(i==3)
  53.                             {
  54.                                 if((b = strtok(line, ")"))) {
  55.                                 fscanf(p,"%d",matricula[i].lista_asign);
  56.                                 }
  57.                             }
  58.  
  59.                         }
  60.      
  61.                     }
  62.                     else {
  63.                         if(ferror(p)) {
  64.                            
  65.                         }
  66.                         else if(feof(p)) {
  67.                            
  68.                         }
  69.                     }
  70.                 }
  71.             }
  72.               fclose(p);
  73.                
  74.          }
  75. }
  76.  
  77. main() {
  78.  
  79.   leermatricula(*matricula);
  80.  
  81. }
  #7 (permalink)  
Antiguo 29/05/2014, 04:36
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: leer fichero y guardarlo en matriz (2)

Creo que deberias revisar tus apuntes, las secciones de declaracion de variables, punteros a variables y argumentos de funciones.

Basicamente tienes lo siguiente:

Definicion de una estructura:

Código C:
Ver original
  1. struct MATRICULA {
  2.    int dato;
  3. };
  4. typedef struct MATRICULA MATRICULA;
  5.  
  6. /*equivale a
  7. typedef struct {
  8.  int dato;
  9. } MATRICULA;*/

Declaracion de variable:

Código C:
Ver original
  1. MATRICULA matricula;

Declaracion de puntero nulo:

Código C:
Ver original
  1. MATRICULA *lpmatricula = 0;

Declaracion de puntero a variable:
Código C:
Ver original
  1. MATRICULA matricula, *lpmatricula;
  2. lpmatricula = &matricula;

Prototipo de funcion con argumento de tipo puntero a variable, y llamada a esa funcion:

Código C:
Ver original
  1. void funcion(MATRICULA *);
  2.  
  3. funcion(&matricula);//referenciando una variable
  4. funcion(lpmatricula);//enviando un puntero a variable

Acceso a un elemento de una estructura y de un puntero a estructura:

Código C:
Ver original
  1. matricula.dato = 123;
  2. lpmatricula->dato = 456;

Declarar una variable, enviarla como referencia a una funcion y modificarla desde la funcion:

Código C:
Ver original
  1. typedef struct {
  2.     int dato;
  3. } MATRICULA;
  4.  
  5.  
  6. void funcion(MATRICULA *lpmatricula) {
  7.     lpmatricula->dato = 100;
  8. }
  9.  
  10.  
  11. int main() {
  12.     MATRICULA matricula;
  13.  
  14.     matricula.dato = 0;
  15.     funcion(&matricula);
  16.     printf("%d", matricula.dato);
  17.  
  18.     return 0;
  19. }

Revisa todo esto, para resolver el ejercicio tienes que tener claros todos estos conceptos. Si no es asi te sugiero que eches un vistazo en profundidad a algun manual de C (lo que he puesto yo es muy por envcima).

De todas formas esto no resuelve lo de la lista de estructuras. En tu caso dado que la funcion carga la lista de matriculas tambien deberia de encargarse de llamar a las funciones que reserven la memoria necesaria para todas las matriculas. Te sugiero que eches un vistazo a algo de listas enlazadas simples y memoria dinamica. En este mismo foro ha aparecido muchas veces el tema.

Saludos
vosk
  #8 (permalink)  
Antiguo 29/05/2014, 08:43
Avatar de Totti7  
Fecha de Ingreso: mayo-2012
Ubicación: barcelona
Mensajes: 28
Antigüedad: 12 años, 7 meses
Puntos: 2
Respuesta: leer fichero y guardarlo en matriz (2)

Guay, muchas gracias vosk por los consejos y por tu tiempo xD
Gracias:D
  #9 (permalink)  
Antiguo 29/05/2014, 11:41
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 12 años, 4 meses
Puntos: 83
Respuesta: leer fichero y guardarlo en matriz (2)

"...muchas gracias vosk por los consejos y por tu tiempo..."

Ok no hay de que. De todas formas quiero insistir en que debes aprender a implementar una lista enlazada o no conseguiras resolver el ejercicio.

Saludos
vosk

Etiquetas: arrays, lenguajec, matriz
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:37.