Ayuda al leer archivo

Iniciado por mnd00003, 8 Octubre 2014, 11:26 AM

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

mnd00003

Buenas, necesito leer un archivo con los datos de dos matrices, el archivo contiene en primer lugar el numero de elementos(n), es decir la matrices serían de n x n , despues de una linea en blanco tengo los datos de la primera matriz separados por filas y con espacios en blanco entre columnas, el problema me surge con la segunda matriz, que también tiene los datos separados por filas, pero entre columnas el número de espacios en blanco entre datos de las distintas columnas varía, mi duda es cómo puedo obtener los datos de la matriz eliminando esos espacios en blanco. Aqui dejo un ejemplo de un archivo:

2

53 66
73 75

47   348 
7  71

La primera matriz he conseguido rellenarla con el código siguiente, pero no conozco la manera de rellenar la segunda eliminando los espacios en blanco, a ver si alguien puede echarme una manita :D Gracias!

int main(int argc, char** argv) {

    int tam;

    string filename = "bur26a.csv";
    string entrada;
    ifstream fi;
    stringstream ss;
    fi.open(filename.c_str());
    if (fi.good()) {
       
        getline(fi, entrada);
        ss.str(entrada);
        ss>>tam;
        int m1[tam][tam];
        int m2[tam][tam];
        getline(fi, entrada); // Elimino fila vacía
        for (int k = 1; k <= tam; k++) {
             
                for (int i = 0; i < tam; i++) {
                    getline(fi,entrada);
                    ss.str(entrada);
                    for (int j = 0; j < tam; j++) {
                        ss >> m1[i][j];
                        ss.ignore(1);                     
                    }
                }
            }

        }
       
       

    }

}
fi.close();

rir3760

Lo primero que debes hacer es verificar el numero de llaves ya que tal como esta tu fragmento las ultimas dos lineas:
Código (cpp) [Seleccionar]
}
fi.close();

Están fuera de la función main.

Ademas:

* Si no utilizas los argumentos pasados mediante la linea de comandos eliminalos, deja la definición de la función como "int main() ...".

* Si la declaración de los arrays m1 y m2 funciona depende del compilador utilizado, no es parte del estándar de C++ (para el caso utilizar objetos de la clase vector).

* Ya que todo lo que lees del archivo son valores de tipo int no es necesario leer por linea con getline, en su lugar utiliza directamente el operador ">>".

* Para leer la primera matriz utilizas tres bucles cuando solo necesitas dos.

Para leer mediante un objeto de la clase vector la primera matriz el código fuente seria mas o menos así:
Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <vector>

using namespace::std;

int main()
{
   ifstream fi("bur26a.csv");
   
   if (fi.good()){
      int num_elem;
      fi >> num_elem;
      vector< vector<int> > mat(num_elem, vector<int>(num_elem));
     
      for (int i = 0; i != num_elem; ++i)
         for (int j = 0; j != num_elem; ++j)
            fi >> mat[i][j];
      fi.close();
     
      for (int i = 0; i != num_elem; ++i){
         for (int j = 0; j != num_elem; ++j)
            cout << ' ' << mat[i][j];
         
         cout << endl;
      }
   }
   
   return 0;
}


Para leer la segunda matriz el proceso es similar.

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