2009-06-06 3 views
17

Похоже, это должно быть простым, но я не нашел его в сетевом поиске.Обнаружение причины сбоя открытия потока, когда fail() истинно

У меня есть поток, который равен open(), и fail() теперь верен. Я хотел бы знать причину отказа открыть, как с errno Я бы сделал sys_errlist[errno].

ответ

5

К сожалению, нет стандартного способа выяснить, почему именно открытая() не удалось. Обратите внимание, что sys_errlist не является стандартным C++ (или, как мне кажется, стандартным C).

18

Функция strerror от <cstring> может быть полезна. Это не обязательно стандартный или портативный, но это работает хорошо для меня, используя GCC на поле 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" 
    } 

} 
+5

Это может хорошо работать, и strerror() - стандартная функция C++. К сожалению, в стандарте не указано, что open() устанавливает errno, поэтому вы не можете полностью зависеть от него. – 2009-06-06 22:06:50

+0

Кажется, нужно работать в VS2013 Update 3 – paulm

2

Это портативный, но не появляется, чтобы дать полезную информацию:

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

нам не нужно использовать зЬй :: fstream, мы используем подталкивание :: 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); 

} 
+1

Итак, что будет отображаться при сбое? – paulm