2011-08-16 12 views
7

En mi código que estoy pasado una referencia a un iostream, que en este caso es en última instancia un archivo.
¿Hay alguna manera de saber si, cuando fue abierto, se ajusta a [in | out] no sólo [en]?¿Puedo solicitar un iostream si es grabable?

+0

¿Es realmente un 'iostream &'? Si es así, hereda de ambos 'istream' y' ostream', y, por lo tanto, puede escribirse. Si está tomando una referencia a la clase base, 'ios', entonces está viendo usar RTTI o funciones de plantilla. –

+3

std :: fstream f ("/ work/file.txt", std :: ios_base :: in); - f hereda ostream pero no se puede escribir. –

+0

¿Pero por qué harías eso, excepto para molestar a las personas que quieren saber si pueden escribir en el archivo? – UncleBens

Respuesta

3

Después de mirar todos los miembros de IOS, iostream, ostream, que no vi ninguna manera de recuperar la bandera openmode utilizado. Supongo que tendrás que intentar escribir algo a tu referencia y detectar cualquier error que arroje. O dependiendo de cómo esté configurado, verifique el resultado de bad().

-2

... tipo de

if (dynamic_cast<ostream*>(MyStreamPtr) == 0) 
{ 
    // Not for output... 
} 
1

El openmode se pasa al std::streambuf, pero no hay métodos para recuperarlo. La única manera de saber si el archivo está abierto para operaciones de escritura está tratando de escribir y la comprobación de f.fail(), u opcionalmente f.bad() (equivalente a f.rdstate() & std::fstream::badbit).

Cuestiones relacionadas