Martes 12 de Noviembre de 2024, 20:51
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[Solucionado] Cambiar state flag despues de un fail()
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: [Solucionado] Cambiar state flag despues de un fail() (Leído 1891 veces)
jorgelaprida
Nuevo Miembro
Mensajes: 11
[Solucionado] Cambiar state flag despues de un fail()
«
en:
Miércoles 29 de Abril de 2009, 21:51 »
0
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.
Tweet
«
última modificación: Jueves 30 de Abril de 2009, 13:57 por jorgelaprida
»
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Cambiar state flag despues de un fail()
«
Respuesta #1 en:
Miércoles 29 de Abril de 2009, 21:58 »
0
¿Estas seguro de que justo despues de llamar a clear fail devuelve true?
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
jorgelaprida
Nuevo Miembro
Mensajes: 11
Re: Cambiar state flag despues de un fail()
«
Respuesta #2 en:
Miércoles 29 de Abril de 2009, 22:36 »
0
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
.
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
Moderador
Mensajes: 4696
Nacionalidad:
Re: Cambiar state flag despues de un fail()
«
Respuesta #3 en:
Miércoles 29 de Abril de 2009, 23:13 »
0
Mmm pero si no volves a usar convertir1 despues del fail ... depuralo a ver si podes entenderlo mejor.
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
jorgelaprida
Nuevo Miembro
Mensajes: 11
Re: Cambiar state flag despues de un fail()
«
Respuesta #4 en:
Jueves 30 de Abril de 2009, 00:03 »
0
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.
Eternal Idol
Moderador
Mensajes: 4696
Nacionalidad:
Re: Cambiar state flag despues de un fail()
«
Respuesta #5 en:
Jueves 30 de Abril de 2009, 10:25 »
0
Ya esta, me costo pero encontre una forma de hacerlo funcionar, primero use ignore y iba sin problemas para la t, pero despues se me ocurrio cambiar la t por tx o xp1345, y ya no servia, al final me di cuenta de que lo que necesitaba era ignorar todo lo que habia y asi quedo:
Código: Text
if(convertir1.fail())
{
cerr<<"error"<<endl;
convertir1.clear();
convertir1.seekg(0, ios_base::end);
revisar = 0;
}
Usando seekg vamos hasta el final y en la siguiente pasada no da error si el dato es valido
Nacional y Popular
En mi país la bandera de Eva es inmortal.
Queremos una Argentina socialmente justa, económicamente libre y políticamente soberana.
¡Perón cumple, Evita dignifica!
La mano invisible del mercado me robo la billetera.
jorgelaprida
Nuevo Miembro
Mensajes: 11
Re: Cambiar state flag despues de un fail()
«
Respuesta #6 en:
Jueves 30 de Abril de 2009, 13:56 »
0
Muchas gracias!!!!
Yo creí en principio que podía hacerlo con flush(). Como flush() pertenece a ostream, pense que el error era no asignar el stream a un dispositivo de salida. Entonces cambié la linea 33:
Código: C++
cerr
<<
"error"
<<
endl
;
convertir1.
flush
(
)
;
revisar
=
00
;
convertir1.
clear
(
)
;
por esta:
Código: C++
cerr
<<
"error"
<<
endl
<<
convertir1.
flush
(
)
;
revisar
=
00
;
convertir1.
clear
(
)
;
y de paso me enteraba que había encontrado. Pero no funcionó. Se ve que flush() solo vacía el buffer, no el stream. Y fail() no es true hasta la próxima pasada en la que vuelve a leer el stream.
Realmente estaba atorado.
Otra pregunta al margen:
Uso el compilador gcc, si compilo con la opción "-Wall" es normal que no me avise que el flujo no esta asignado a nada, cuando usaba convertir1.flush().
Saludos.
jorgelaprida
Nuevo Miembro
Mensajes: 11
Re: [Solucionado] Cambiar state flag despues de un fail()
«
Respuesta #7 en:
Jueves 30 de Abril de 2009, 21:01 »
0
Otra forma de "limpiar" el stream es usando str()
Código: C++
if
(
convertir.
fail
(
)
)
{
cerr
<<
"error "
<<
endl
;
convertir.
clear
(
)
;
//reseteo las states flags
convertir.
str
(
""
)
;
//reseteo el stream sobreescribiendolo
revisarcoordenada
=
0
;
}
Así también se resuelven los casos que nombro Eternal Idol. Todavía estoy tratando de resolver, cuando en el archivo aparecen errores del tipo "4tt", que el programa no lea solo 4 y yo no me de cuenta.
Saludos.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[Solucionado] Cambiar state flag despues de un fail()