2009-06-06 18 views
17

ऐसा लगता है कि यह सरल होना चाहिए, लेकिन मुझे इसे नेट खोज में नहीं मिला है।विफल होने पर ऑफ़स्ट्रीम खोलने में विफलता के कारण का पता लगाना() सत्य है

मेरे पास एक ऑफस्ट्रीम है जो open() है, और fail() अब सत्य है। मैं खोलने में विफलता का कारण जानना चाहता हूं, जैसे errno मैं sys_errlist[errno] करूँगा।

उत्तर

5

दुर्भाग्य से, वहाँ जानने वास्तव में क्यों खुला() विफल करने का कोई मानक तरीका है। ध्यान दें कि sys_errlist मानक C++ नहीं है (या मानक सी, मुझे विश्वास है)।

18

strerror<cstring> से फ़ंक्शन उपयोगी हो सकता है। यह आवश्यक रूप से मानक या पोर्टेबल नहीं है, लेकिन यह एक 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() एक मानक सी ++ समारोह है। दुर्भाग्यवश, मानक यह नहीं बताता है कि खुले() त्रुटियों को सेट करता है, इसलिए आप पूरी तरह से इस पर निर्भर नहीं हो सकते हैं। –

+0

वीएस2013 अपडेट 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

हम std :: 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

संबंधित मुद्दे