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?
7
A
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
).
È 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. –
std :: fstream f ("/ work/file.txt", std :: ios_base :: in); - f eredita ostream ma non è scrivibile. –
Ma perché dovresti farlo, se non per infastidire le persone che vogliono scoprire se possono scrivere sul file? – UncleBens