Programación General > C/C++
error al cargar archivo cvs
(1/1)
jorgelaprida:
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++ --- template <class T>void Matriz<T>::cargarMatriz(string archivo, char delimitador){ ifstream ar ; string linea, palabra; stringstream is;//stream para procesar lineas stringstream os;//stream para procesar palabras ar.open(archivo.c_str()); while (getline(ar,linea)) { is<<linea; matriz.push_back(vector <T> ()); while(!is.eof() ) { getline(is,palabra,delimitador); os<<palabra; T valor; os>>valor; matriz.back().push_back(valor); os.clear(); } is.clear(); } ar.close(); }
y el código para mostrar el contenido es:
--- Código: C++ ---template <class T>void Matriz<T>:: mostrar(){ typedef typename vector<vector<T> >::iterator itfila;itfila iteradorFila = matriz.begin();itfila finDeFila = matriz.end();for(;iteradorFila < finDeFila; iteradorFila++) { typedef typename vector<T> ::iterator itcolumna;itcolumna iteradorColumna = iteradorFila->begin();itcolumna finDeColumna = iteradorFila->end(); for(; iteradorColumna < finDeColumna ; iteradorColumna++ ) cout << setw ( 5 ) << *iteradorColumna; cout<<endl; }}
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:
¿Has probado a comprobar qué carácter estás leyendo antes de insertarlo en la matriz? isdigit()
Salud
jorgelaprida:
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++ --- #include<typeinfo> ... if( typeid(valor).name()==typeid(T).name())matriz.back().push_back(valor); elsematriz.back().push_back(-99);
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.
Navegación
Ir a la versión completa