Detectar a razão para o fracasso em abrir um OFSTREAM quando Fail () é verdadeiro
Pergunta
Parece que isso deve ser simples, mas não o encontro em uma pesquisa na rede.
Eu tenho um de stream que é open()
, e fail()
agora é verdade. Eu gostaria de saber o motivo do fracasso em abrir, como com errno
eu faria sys_errlist[errno]
.
Solução
Infelizmente, não existe uma maneira padrão de descobrir exatamente por que o Open () falhou. Observe que sys_errlist não é padrão C ++ (ou padrão C, acredito).
Outras dicas
o Strorror função de <cstring>
pode ser útil. Isso não é necessariamente padrão ou portátil, mas funciona bem para mim usando o GCC em uma caixa do Ubuntu:
#include <iostream>
using std::cout;
#include <fstream>
using std::ofstream;
#include <cstring>
using std::strerror;
#include <cerrno>
int main() {
ofstream fout("read-only.txt"); // file exists and is read-only
if( !fout ) {
cout << strerror(errno) << '\n'; // displays "Permission denied"
}
}
Isso é portátil, mas não parece dar informações úteis:
#include <iostream>
using std::cout;
using std::endl;
#include <fstream>
using std::ofstream;
int main(int, char**)
{
ofstream fout;
try
{
fout.exceptions(ofstream::failbit | ofstream::badbit);
fout.open("read-only.txt");
fout.exceptions(std::ofstream::goodbit);
// successful open
}
catch(ofstream::failure const &ex)
{
// failed open
cout << ex.what() << endl; // displays "basic_ios::clear"
}
}
Não precisamos usar std :: fStream, usamos o boost :: iostream
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/stream.hpp>
void main()
{
namespace io = boost::iostreams;
//step1. open a file, and check error.
int handle = fileno(stdin); //I'm lazy,so...
//step2. create stardard conformance streem
io::stream<io::file_descriptor_source> s( io::file_descriptor_source(handle) );
//step3. use good facilities as you will
char buff[32];
s.getline( buff, 32);
int i=0;
s >> i;
s.read(buff,32);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow