Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mnd00003 en 8 Octubre 2014, 11:26 am



Título: Ayuda al leer archivo
Publicado por: mnd00003 en 8 Octubre 2014, 11:26 am
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!

Código:
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();


Título: Re: Ayuda al leer archivo
Publicado por: rir3760 en 13 Octubre 2014, 18:13 pm
Lo primero que debes hacer es verificar el numero de llaves ya que tal como esta tu fragmento las ultimas dos lineas:
Código
  1. }
  2. 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
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4.  
  5. using namespace::std;
  6.  
  7. int main()
  8. {
  9.   ifstream fi("bur26a.csv");
  10.  
  11.   if (fi.good()){
  12.      int num_elem;
  13.      fi >> num_elem;
  14.      vector< vector<int> > mat(num_elem, vector<int>(num_elem));
  15.  
  16.      for (int i = 0; i != num_elem; ++i)
  17.         for (int j = 0; j != num_elem; ++j)
  18.            fi >> mat[i][j];
  19.      fi.close();
  20.  
  21.      for (int i = 0; i != num_elem; ++i){
  22.         for (int j = 0; j != num_elem; ++j)
  23.            cout << ' ' << mat[i][j];
  24.  
  25.         cout << endl;
  26.      }
  27.   }
  28.  
  29.   return 0;
  30. }

Para leer la segunda matriz el proceso es similar.

Un saludo