txt texto por manejo linea leer lectura guardar escritura datos crear binarios archivos archivo c++ iostream

c++ - texto - Detectar la razón por la que no se abre un ofstream cuando fail() es verdadero



leer texto c++ (4)

Parece que esto debería ser simple, pero no lo encuentro en una búsqueda en la red.

Tengo un ofstream que está open() , y fail() ahora es verdadero. Me gustaría saber la razón por la que no se abrió, como con errno haría sys_errlist[errno] .


Desafortunadamente, no hay una manera estándar de descubrir exactamente por qué ha fallado open (). Tenga en cuenta que sys_errlist no es C ++ estándar (o Estándar C, creo).


Esto es portátil pero no parece dar información útil:

#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" } }


La función strerror de <cstring> puede ser útil. Esto no es necesariamente estándar o portátil, pero funciona bien para usar GCC en una caja de 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" } }


no necesitamos usar std :: fstream, usamos 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); }