एक सी ++ प्रोग्राम में, std :: ifstream का उपयोग करके, मैं उपयोगकर्ता द्वारा निर्दिष्ट फ़ाइल खोलने का प्रयास कर रहा हूं - अब तक इतना अच्छा है। हालांकि, मैंने गलती से एक फ़ाइल नाम दर्ज किया जो वास्तव में एक निर्देशिका है, और मैं यह देखकर आश्चर्यचकित था कि खोलने का प्रयास() कि निर्देशिका ने कोई त्रुटि उत्पन्न नहीं की है।ifstream open() त्रुटि बिट्स सेट नहीं करता है जब तर्क एक निर्देशिका है
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;
}
त्रुटि का कोई संकेत यहाँ:
यहाँ एक न्यूनतम उदाहरण है। अगर मैं आगे बढ़ता हूं और getline() की कोशिश करता हूं, getline() एक त्रुटि बिट को ठीक से सेट करता है।
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;
यह आउटपुट "गेटलाइन सेट बैडबिट" है, जो उचित है। >> ऑपरेटर का उपयोग करना एक अंडरफ्लो अपवाद फेंकता है, जो भी ठीक है।
अब, मेरा सवाल यह है कि, मैं कैसे पता लगा सकता हूं कि उपयोगकर्ता ने उचित फ़ाइल नाम के बजाय निर्देशिका नाम दर्ज किया है? क्या उसे करने का कोई तरीका है? स्ट्रीम से बाइट प्राप्त करना और अनजान करना कठिन और त्रुटि-प्रवण प्रतीत होता है।
इसके अलावा, ऐसा क्यों है? मुझे एहसास है कि कार्यक्रम के दृष्टिकोण से यह वही डेटा है, लेकिन मुझे लगता है कि ओएस कुछ "अरे, यह एक निर्देशिका है" संदेश भेज देगा।
आप इस व्यवहार को किस मंच पर प्राप्त कर रहे हैं? –
सी ++ में "निर्देशिका" की कोई धारणा नहीं है। आपको कुछ प्लेटफ़ॉर्म-विशिष्ट लाइब्रेरी की आवश्यकता है (जैसे पॉज़िक्स या विंडोज)। –
ओह, उबंटू 10.04, कंपाइलर जीसीसी 4.4.3 है। –