• Miércoles 15 de Abril de 2026, 11:40

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - jorgelaprida

Páginas: [1]
1
C/C++ / [Solucionado] Cambiar state flag despues de un fail()
« en: Miércoles 29 de Abril de 2009, 21:51 »
Hola a todos.
Estoy escribiendo un programa que guarda datos numéricos leídos desde un archivo separado por comas es una estructura y ésta en un vector de la STL. Uso stringstreams para dar formato a los datos de forma segura con "<<" y ">>". Quería asegurarme que los datos fueran válidos (números) revisando si la conversión con ">>" es exitosa y lo hago con la función miembro fail(). El problema surge cuando detecta un error, yo trato de recuperar el stream con la función clear() pero no funciona.
Pongo una parte del código que carga los datos y los muestra con la comprobación en el primer campo del struct como ejemplo.


Código: C++
  1. #include<vector>
  2. #include<fstream>
  3. #include<iostream>
  4. #include<iomanip>
  5. #include<sstream>
  6. #include<string>
  7.  
  8. using namespace std;
  9.  
  10. typedef float coordenada ;
  11. typedef struct posicion { coordenada latitud; coordenada longitud; };
  12. typedef struct pixel { posicion posicionpixel; int cuentadigital; };
  13. typedef  vector<pixel> :: iterator iterador;
  14.  
  15. int main()
  16. {
  17. string linealeida, palabraleida;
  18. coordenada revisar;
  19. vector<pixel>vsat;
  20. pixel p;
  21. fstream flujoentrada ("mat.txt");
  22. stringstream  flujodestrings, convertir1, convertir2, convertir3;
  23.  
  24. while(getline(flujoentrada,linealeida))
  25.  
  26.     {
  27.      flujodestrings<<linealeida;
  28.      getline(flujodestrings,palabraleida,',');
  29.      convertir1<<palabraleida;
  30.      convertir1>>revisar;
  31. if(convertir1.fail())
  32. {
  33. cerr<<"error"<<endl;convertir1.flush();revisar=00;convertir1.clear();
  34. }
  35.  
  36.      p.posicionpixel.latitud=revisar;
  37.      convertir1.clear();
  38.      
  39.      getline(flujodestrings,palabraleida,',');
  40.      convertir2<<palabraleida;
  41.      convertir2>>p.posicionpixel.longitud;
  42.      convertir2.clear();
  43.  
  44.      getline(flujodestrings,palabraleida,',');
  45.      convertir3<<palabraleida;
  46.      convertir3>>p.cuentadigital;
  47.      convertir3.clear();
  48.  
  49.      flujodestrings.clear();
  50.  
  51. vsat.push_back(p);
  52.  
  53.  
  54.      }
  55.  
  56.     cout<<setw(15)<<"latitud";
  57.     cout<<setw(15)<<"longitud";
  58.     cout<<setw(15)<<"cuentadigital"<<endl;
  59.  
  60. for( iterador iter = vsat.begin() ; iter != vsat.end() ; iter++ )
  61.     {  
  62.              
  63.     cout<<setw(15)<<iter->posicionpixel.latitud;
  64.     cout<<setw(15)<<iter->posicionpixel.longitud;
  65.     cout<<setw(15)<<iter->cuentadigital<<endl;
  66.  
  67.     }
  68.  
  69. return 0;
  70.  
  71. }
  72.  

Si mat.txt es así:

99,66,33
t,55,22
77,44,11
55,33,99

la salida es:

error
error
error
        latitud       longitud  cuentadigital
             99             66             33
              0             55             22
              0             44             11
              0             33             99

Estoy seguro que el problema está en que bloquea el flujo convertir1.
¿Alguien sabe si se me pasa algo por alto?

Saludos y gracias de antemano.

2
C/C++ / error al cargar archivo cvs
« en: Lunes 20 de Abril de 2009, 23:08 »
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.

Páginas: [1]