2008-11-20 17 views
12

¿Hay alguna forma de obtener una condición de error específica cuando falla una secuencia abierta de C++? Es decir, si falló porque el archivo no existía, o los permisos eran incorrectos, o básicamente. Básicamente estoy buscando una funcionalidad equivalente a errno para fopen() en C. normal¿Se puede obtener una condición de error específica cuando falla una secuencia abierta de C++?

GCC parece configurar correctamente el errno , pero eso no parece ser requerido por el estándar de C++ y no puedo determinar si esto es solo un artefacto de la forma en que implementaron las secuencias, o una característica deliberada (y por lo tanto, no sé si persistirá en versiones).

¿Hay alguna manera de obtener esta información de manera confiable, ya sea en C++ estándar o de forma no accidental en uno o más compiladores principales?

Respuesta

0

En Visual Studio, fopen y similares configuran el último valor del código de error. Se puede recuperar con GetLastError(). El resultado será uno de los valores these.

+0

¿Tiene algún vínculo a dónde se presenta esto en el documento VS? He estado mirando las páginas de transmisión en MSDN pero no puedo encontrar ninguna mención de este comportamiento. No digo que no funcione así, pero sería bueno ver algún documento oficial. –

+0

No creo que esté dispuesto en los documentos de VS. O tal vez mi google-foo es demasiado débil. Sin embargo, encontré varias publicaciones de foros que respaldan mi recuerdo de que fopen y similares son envoltorios de sus funciones de winapi equivalentes. Así que fopen está llamando a CreateFile, que establece el código de error. Independientemente, una prueba rápida debe confirmar (al menos para los errores de archivo fáciles de simular). Lo haría yo mismo y publicaría los resultados. Pero, por desgracia, no tengo fácil acceso a Visual Studio en este momento. –

4

Puede ver las marcas ios (badbit, eofbit, failbit, goodbit) por razones generales. La prueba de voluntad es más fácil usando ios :: bad(), ios :: fail(), ios :: eof(), o ios :: good(). La transmisión también se puede configurar para generar excepciones por error, usando ios :: exceptions().

Los informes detallados de error de E/S pueden estar disponibles en algunas implementaciones, como usted señala para GCC. Es posible que deba confiar en este comportamiento para los diferentes compiladores. Si existe la posibilidad de que haya varios compiladores, asegúrese de probar y probablemente incluir declaraciones de preprocesador para verificar el compilador actual, etc.
Hasta donde yo sé, el único otro lugar del que se habla está en proposed TR2 additions.

Cuestiones relacionadas