In un programma C++, usando std :: ifstream, sto tentando di aprire un file specificato dall'utente - finora così buono. Tuttavia, ho accidentalmente inserito un nome di file che è in realtà una directory, e sono rimasto piuttosto sorpreso nel vedere che il tentativo di aprire() quella directory non ha generato alcun errore.Ifstream open() non imposta i bit di errore quando argomento è una directory
Ecco un esempio minimo:
std::ifstream f;
f.open("..");
if(!f.is_open() || !f.good() || f.bad() || f.fail()) {
std::cout << "error bit set on open" << std::endl;
return 1;
}
Nessun segno di un errore qui. Se continuo a tentare di getline(), getline() imposta un bit di errore.
std::string str;
getline(f, str);
if(f.eof()) std::cout << "getline set eofbit" << std::endl;
else if(f.bad()) std::cout << "getline set badbit" << std::endl;
else if(f.fail()) std::cout << "getline set failbit" << std::endl;
Questo output "setline set badbit", che è ragionevole. L'utilizzo dell'operatore >> genera un'eccezione di underflow, anch'essa accettabile.
Ora, la mia domanda è, come posso rilevare che l'utente ha inserito un nome di directory invece di un nome file corretto? C'è un modo per farlo? Ottenere e annullare i byte dal flusso sembrano noiosi e soggetti a errori.
Inoltre, perché è così? Mi rendo conto che sono tutti gli stessi dati dal punto di vista del programma, ma suppongo che il sistema operativo invii anche un messaggio di tipo "hey, this is a directory".
Su quale piattaforma stai ottenendo questo comportamento? –
C++ non ha la nozione di "directory". È necessaria una libreria specifica per piattaforma (come Posix o Windows). –
Oh, Ubuntu 10.04, il compilatore è gcc 4.4.3. –