• Lunes 16 de Diciembre de 2024, 02:45

Autor Tema:  error al cargar archivo cvs  (Leído 1237 veces)

jorgelaprida

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
error al cargar archivo cvs
« en: Lunes 20 de Abril de 2009, 23:08 »
0
Hola a todos. Estoy tratando de cargar números que están un un archivo separado por comas en una matriz.
Para ejemplificar, el archivo contiene esto:

1,5,8,43,8
78,34,6,2

pero al cargar los valores a la matriz obtengo lo siguiente:

1,5,8,43,8
78,34,6,2
2

el codigo para cargar la matriz es el siguiente;

Código: C++
  1.  
  2. template <class T>
  3. void Matriz<T>::cargarMatriz(string archivo, char delimitador)
  4. {
  5.  
  6. ifstream ar ;
  7.   string linea, palabra;
  8.   stringstream is;//stream para procesar lineas
  9.   stringstream os;//stream para procesar palabras
  10.   ar.open(archivo.c_str());
  11.  
  12.  
  13.   while (getline(ar,linea))
  14.     {
  15.          
  16.       is<<linea;
  17.  
  18.  matriz.push_back(vector <T> ());  
  19.  
  20.  while(!is.eof() )
  21.     {
  22.      
  23.         getline(is,palabra,delimitador);
  24.         os<<palabra;
  25.         T valor;
  26.         os>>valor;
  27.         matriz.back().push_back(valor);
  28.          os.clear();
  29.        
  30.          
  31.     }
  32.  
  33.       is.clear();
  34.    
  35.     }
  36.       ar.close();
  37.  }
  38.  
  39.  


y el código para mostrar el contenido es:

Código: C++
  1. template <class T>
  2. void Matriz<T>:: mostrar()
  3. {
  4.  
  5.  
  6.   typedef typename vector<vector<T> >::iterator itfila;
  7. itfila iteradorFila = matriz.begin();
  8. itfila finDeFila = matriz.end();
  9. for(;iteradorFila < finDeFila; iteradorFila++)
  10.     {
  11.  
  12.  typedef typename vector<T> ::iterator itcolumna;
  13. itcolumna iteradorColumna = iteradorFila->begin();
  14. itcolumna finDeColumna = iteradorFila->end();
  15.       for(; iteradorColumna < finDeColumna ; iteradorColumna++ )
  16.    
  17.  
  18.     cout << setw ( 5 ) << *iteradorColumna;
  19.  
  20.       cout<<endl;
  21.     }
  22. }
  23.  
  24.  

El problema desaparece si abro el archivo a leer con un editor de texto, me sitúo en la última linea (que no tiene ningún valor numérico) y la borro dejando el cursor junto al último número de la última linea.

Interpreto que estoy leyendo esta linea (vacía) con getline() pero no estoy seguro de como evitarlo (con ignore() será?).
Saludos y gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: error al cargar archivo cvs
« Respuesta #1 en: Martes 21 de Abril de 2009, 10:00 »
0
¿Has probado a comprobar qué carácter estás leyendo antes de insertarlo en la matriz? isdigit()

Salud

jorgelaprida

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: error al cargar archivo cvs
« Respuesta #2 en: Miércoles 22 de Abril de 2009, 14:51 »
0
Hola y gracias por responder.

Primero quería aclarar que olvidé modificar la linea 20: while(!is.eof() ) por una comprobación como en la linea 13, quedaría así:
20:while( getline(is,palabra,delimitador)) y la linea 23 desaparece. No es buena idea usar eof(). Así el error del último número duplicado desaparece pero igual queda una linea vacía si hay un "enter" al final del archivo.

No use isdigit() porque no quería desglosar el string y leer por caracteres.
Quería comprobar el valor completo, algo así:

Código: C++
  1.  
  2. #include<typeinfo>
  3.  
  4. ...
  5.  
  6. if( typeid(valor).name()==typeid(T).name())
  7. matriz.back().push_back(valor);
  8.  
  9. else
  10. matriz.back().push_back(-99);
  11.  
  12.  
  13.  

pero yo declaro valor del tipo T asi que no sirve.
Quizá sea un error usar un stringstream para formatear los datos del archivo.

Otra cosa que no entiendo es que si, usando el código con la modificación de arriba, si pongo una letra en vez de un número en el archivo la matriz se llena con el último valor numérico obtenido antes de la letra en el resto de la matriz.
por ejemplo, si la matriz en el archivo es:

1,2,3,4
5,k,6,7  

la matriz cargada se llena así:

1,2,3,4
5,5,5,5

Creo que en cualquier momento  :hitcomp: .

Igual no se si es la forma correcta de generar una matriz, tal vez deba cambiar el enfoque.
Saludos.