Programación General > C/C++

 [Solucionado] Cambiar state flag despues de un fail()

(1/2) > >>

jorgelaprida:
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++ ---#include<vector>#include<fstream>#include<iostream>#include<iomanip>#include<sstream>#include<string>  using namespace std; typedef float coordenada ;typedef struct posicion { coordenada latitud; coordenada longitud; };typedef struct pixel { posicion posicionpixel; int cuentadigital; };typedef  vector<pixel> :: iterator iterador; int main(){string linealeida, palabraleida;coordenada revisar;vector<pixel>vsat;pixel p;fstream flujoentrada ("mat.txt");stringstream  flujodestrings, convertir1, convertir2, convertir3; while(getline(flujoentrada,linealeida))     {     flujodestrings<<linealeida;     getline(flujodestrings,palabraleida,',');     convertir1<<palabraleida;     convertir1>>revisar;if(convertir1.fail()){cerr<<"error"<<endl;convertir1.flush();revisar=00;convertir1.clear();}      p.posicionpixel.latitud=revisar;     convertir1.clear();          getline(flujodestrings,palabraleida,',');     convertir2<<palabraleida;     convertir2>>p.posicionpixel.longitud;     convertir2.clear();      getline(flujodestrings,palabraleida,',');     convertir3<<palabraleida;     convertir3>>p.cuentadigital;     convertir3.clear();      flujodestrings.clear(); vsat.push_back(p);       }     cout<<setw(15)<<"latitud";    cout<<setw(15)<<"longitud";    cout<<setw(15)<<"cuentadigital"<<endl; for( iterador iter = vsat.begin() ; iter != vsat.end() ; iter++ )    {                    cout<<setw(15)<<iter->posicionpixel.latitud;    cout<<setw(15)<<iter->posicionpixel.longitud;    cout<<setw(15)<<iter->cuentadigital<<endl;     } return 0; } 
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.

Eternal Idol:
¿Estas seguro de que justo despues de llamar a clear fail devuelve true?

jorgelaprida:
Hola. Gracias por contestar.
Tenés razón, fail no no devuelve true. Yo creía que el error podría estar ahí, pero no.
Antes no entendía que pasaba, ahora creo que estoy asustado  :D .
Si yo vacié el flujo con flush() y limpié las banderas con clear() ¿por qué el flujo sigue "bloqueado" con el valor anterior? Porque el contenido de "palabraleida" va cambiando como corresponde a la entrada.

Eternal Idol:
Mmm pero si no volves a usar convertir1 despues del fail ... depuralo a ver si podes entenderlo mejor.

jorgelaprida:
Te cuento que en la pc que estoy ahora tiene fedora 8 y aunque compilo con "g++ -g", gdb no me reconoce el archivo compilado como ejecutable aunque la salida de  file confirma que es ELF. Creo que es un problema con esta versión de fedora.

Igualmente, convertir1 lo usa cada vez que lee una linea nueva del archivo. En una versión anterior usaba solo un stream convertir en vez de los tres distintos.
En ese caso la salida era:

      latitud           longitud       cuentadigital
             99             66             33
             99             66             33
             99             66             33
             99             66             33

y como estoy sin depurador por el momento agregue un par de salidas.
 
pasada1
linealeida 99,66,33
palabraleida  99
palabraleida  66
palabraleida  33

pasada2
linealeida t,55,22
palabraleida  t
palabraleida  55
palabraleida  22

pasada3
linealeida 77,44,11
palabraleida  77
palabraleida  44
palabraleida  11

pasada4
linealeida 55,33,99
palabraleida  55
palabraleida  33
palabraleida  99

por lo que pienso que el problema es con el stream pero no estoy seguro que hacer.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa