2011-08-16 2 views
7

Nel mio codice mi è passato un riferimento ad un iostream, che in questo caso è in definitiva un file.
C'è un modo per scoprire se, quando è stato aperto, è stato impostato su [in | out] non solo [in]?Posso chiedere a un iostream se è scrivibile?

+0

È effettivamente un 'iostream &'? Se è così, eredita sia da 'istream' che da' ostream', e, quindi, è scrivibile. Se stai prendendo un riferimento alla classe base, "ios", allora stai guardando sia usando RTTI che le funzioni basate su modelli. –

+3

std :: fstream f ("/ work/file.txt", std :: ios_base :: in); - f eredita ostream ma non è scrivibile. –

+0

Ma perché dovresti farlo, se non per infastidire le persone che vogliono scoprire se possono scrivere sul file? – UncleBens

risposta

3

Dopo aver esaminato tutti i membri di IOS, iostream, ostream, non ho visto alcun modo per recuperare la bandiera openmode utilizzato. Immagino che dovrai cercare di scrivere qualcosa per il tuo riferimento e cogliere qualsiasi errore esso possa generare. Oppure, a seconda di come è impostato, controlla il risultato di bad().

-2

... tipo di

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

Il openmode viene passato a std::streambuf, ma non esistono metodi per recuperarlo. L'unico modo per sapere se il file è aperto per operazioni di scrittura sta cercando di scrivere e il controllo per f.fail(), o, in alternativa f.bad() (equivalente a f.rdstate() & std::fstream::badbit).